Запускать и выполнять несколько зависимых команд SSH, используя C # - PullRequest
1 голос
/ 03 июня 2019

Я хочу изменить каталог внутри SSH, используя C # с библиотекой SSH.NET:

SshClient cSSH = new SshClient("192.168.80.21", 22, "appmi", "Appmi");

cSSH.Connect();

Console.WriteLine("current directory:");
Console.WriteLine(cSSH.CreateCommand("pwd").Execute());

Console.WriteLine("change directory");
Console.WriteLine(cSSH.CreateCommand("cdr abc-log").Execute());

Console.WriteLine("show directory");
Console.WriteLine(cSSH.CreateCommand("pwd").Execute());

cSSH.Disconnect();
cSSH.Dispose();

Console.ReadKey();

Но это не работает. Я также проверил ниже:

Console.WriteLine(cSSH.RunCommand("cdr abc-log").Execute());

но все еще не работает.

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Полагаю, вы хотите, чтобы команды влияли на последующие команды.

Но SshClient.CreateCommand использует SSH-канал "exec" для выполнения команды.Это означает, что каждая команда выполняется в изолированной оболочке и не влияет на другие команды.


Если вам нужно выполнять команды так, чтобы предыдущие команды влияли на более поздние команды (например, на изменение рабочего каталогаили установка переменной среды), вы должны выполнить все команды в одном канале.Для этого используйте соответствующую конструкцию серверной оболочки.В большинстве систем вы можете использовать точки с запятой:

Console.WriteLine(cSSH.CreateCommand("pwd ; cdr abc-log ; pwd").Execute());

На * nix-серверах вы также можете использовать &&, чтобы следующие команды выполнялись только при успешном выполнении предыдущих команд:

Console.WriteLine(cSSH.CreateCommand("pwd && cdr abc-log && pwd").Execute());
0 голосов
/ 13 июня 2019

это то, что я сделал, и это работает для меня:

SshClient sshClient = new SshClient("some IP", 22, "loign", "pwd");
sshClient.Connect();

ShellStream shellStream = sshClient.CreateShellStream("xterm", 80, 40, 80, 40, 1024);

string cmd = "ls";
shellStream.WriteLine(cmd + "; echo !");
while (shellStream.Length == 0)
 Thread.Sleep(500);

StringBuilder result = new StringBuilder();
string line;

string dbt = @"PuttyTest.txt";
StreamWriter sw = new StreamWriter(dbt, append: true);           

 while ((line = shellStream.ReadLine()) != "!")
 {
  result.AppendLine(line);
  sw.WriteLine(line);
 }            

 sw.Close();
 sshClient.Disconnect();
 sshClient.Dispose();
 Console.ReadKey();
...