Fadwa DHIFI Ответов: 0

Как удалить определенные строки в файле на удаленном сервере ubuntu с помощью SSH.NET


В конфигурационном файле /etc/ssh/sshd_config я хочу удалить 4 строки, начинающиеся с этой строки, соответствующей пользователю sftpuser. Я разработал код ниже, проблема заключается в функции SFTPCLient.WriteAllLines(string path, IEnumerable<string> contents): не перезаписывает все существующее содержимое, но если новое содержимое длиннее старого, он заменяет те же байты новым, один раз следующим за остальными.
Есть ли для этого альтернатива?

Что я уже пробовал:

<pre lang="c#">
SftpClient sftpClient = new SftpClient("xx.xxx.xxx.xxx", "root", "************");
sftpClient.Connect();
var newLines = new List<string>();
string[] oldlines = sftpClient.ReadAllLines("/sftp/sftpuser/test.txt");
int index = 0;
foreach(string line in oldlines)
{
    if (line.Equals("Match user sftpuser"))
                    {
                        break;
                    }
                    index++;
}

int[] indexdelete = { index, index + 1, index + 2, index + 3 };

for(int i =0; i < oldlines.Length; i++)
       {
                    if (indexdelete.Contains(i)) continue;
                    newLines.Add(oldlines[i]);            
        }         
sftpClient.WriteAllLines("/sftp/sftpuser/test.txt", newLines);
sftpClient.Disconnect();

Garth J Lancaster

1. пожалуйста, обновите свой вопрос, с каким SFTP-клиентом вы используете (используйте "улучшить вопрос")
2. Вы проверили - например, с помощью консоли.WriteLine() и/или отладчик, который в новых строках имеет правильное содержимое ? (т. е. пропущены 4 строки из []indexdelete) ?
3. Вы проверили права доступа к каталогу/файлу ?
4. пробовали ли вы удалить файл перед записью в него новых строк (так как я не могу сказать, что такое sftpClient.WriteAllLines делает) ... попробуйте открыть файл System.IO.Удалить("/sftp/sftpuser/test.txt") перед sftpClient.Пиши все строки ...

Fadwa DHIFI

Здравствуйте, 1. я не совсем понял это замечание, но использую SSH.NET
2.я уверен в содержании новых строк (я использовал консоль.метод WriteLine())
3. Да, на самом деле, он записывает в него, но не перезаписывает все это: sftpClient.WriteAllLines не перезаписывает все существующее содержимое, но если новое содержимое длиннее старого, оно заменяет те же байты новым, один раз следующим за остальными.
4. я не хочу рисковать удалением этого файла: это может помешать мне снова сформировать ssh.

Garth J Lancaster

Из того, что я видел в дискуссиях о "WriteAllLines", он будет записывать в файл, но не усекать его первым (я еще не нашел точного кода для библиотеки) ..

В таком случае, можете ли вы написать eg /sftp/sftpuser/test.txt.новый", если все остальное, что вы делаете, успешно, удалите исходный файл и переименуйте .new в исходное имя файла ?

Richard MacCutchan

Какой SftpClient вы используете? Убедитесь, что он полностью перезаписывает файл с помощью метода WriteAllLines.

0 Ответов