Как удалить определенные строки в файле на удаленном сервере 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.