Хотя ответ @LzyPanda работает, использование канала оболочки SSH (SshClient.CreateShellStream
), пусть только интерактивный терминал, не является хорошей идеей для автоматизации выполнения команд. От этого вы получаете множество побочных эффектов, таких как командные строки, последовательности ANSI, интерактивное поведение некоторых команд и т. Д.
Для автоматизации используйте канал SSH exec (SshClient.CreateCommand
):
using (var command = ssh.CreateCommand("command"))
{
Console.Write(command.Execute());
}
Если вам нужно выполнить несколько команд, повторите приведенный выше код. Вы можете создать любое количество каналов exec для одного SSH-соединения.
Хотя, если команды зависят друг от друга (первая команда изменила среду, например, переменные, которые используются последними командами), вы должны выполнить их в одном канале. Используйте для этого синтаксис оболочки, например &&
или ;
:
using (var command = ssh.CreateCommand("command1 && command2"))
{
Console.Write(command.Execute());
}
Если вам нужно постоянно читать вывод команд, используйте:
using (var command = ssh.CreateCommand("command"))
{
var asyncExecute = command.BeginExecute();
command.OutputStream.CopyTo(Console.OpenStandardOutput());
command.EndExecute(asyncExecute);
}
Вы также можете использовать ExtendedOutputStream
, который содержит как stdout, так и stderr. См. Мониторинг вывода команд SSH.NET в реальном времени.
К сожалению, реализация канала exec в SSH.NET не позволяет вводить команду. В этом случае вам нужно будет прибегнуть к каналу оболочки, пока это ограничение не будет устранено.
person
Martin Prikryl
schedule
28.06.2017