SSH с несколькими переходами через SSH.NET в C#

#c# #ssh #ssh.net

#c# #.net #ssh #ssh.net

Вопрос:

Я подключаюсь по SSH к машине Linux и снова оттуда хочу подключиться по SSH к другой машине Linux для выполнения нескольких принудительных задач.

 using (SshClient ssh = new SshClient("ip address","username", "pwd"))
{
    ssh.Connect();
    command = ssh.CreateCommand("ssh hostname");
    result = command.Execute();
    Console.WriteLine(result);
}
  

Где ssh hostname это пароль меньше ssh. Как я могу управлять вторым сеансом SSH и передавать ему команды?

Даже исследовал CreateShell функцию, но, похоже, она не рекомендуется для автоматизации.

Комментарии:

1. Что произойдет, если вы просто создадите новую команду и отправите ее (например, touch test ) и посмотрите, на какой машине она выполняется (на ней есть файл test ?)

2. Я попробовал команду «ls -la», и она была выполнена в самом первом сеансе ssh.

3. Что это значит «ssh без пароля»? Как это настроено / разрешено?

4. Я настроил ssh без пароля из моего первого окна Linux во второе. tecmint.com /…

Ответ №1:

В общем, попытка автоматизировать ssh команду — плохой дизайн.

Для реализации «перехода» лучше использовать переадресацию портов (он же SSH-туннель).

 var firstClient =
    new SshClient(firstHostName, firstUserName, firstPassword);
firstClient.Connect();

var port = new ForwardedPortLocal("127.0.0.1", secondHostName, 22);
firstClient.AddForwardedPort(port);
port.Start();

var secondClient =
    new SshClient(port.BoundHost, (int)port.BoundPort, secondUserName, secondPassword);
secondClient.Connect();

var command = secondClient.CreateCommand("ls");
var result = command.Execute();
Console.WriteLine(result);
  

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

Даже в этом случае попробуйте поговорить с системным администратором, чтобы найти лучшее решение. Закрытый ключ по-прежнему доступен с использованием учетных данных, содержащихся в вашем приложении, поэтому он не был бы защищен лучше, если бы сам закрытый ключ содержался непосредственно в приложении.

В любом случае, ssh может принять команду в своей командной строке, например:

 command = ssh.CreateCommand("ssh hostname command");
result = command.Execute();
Console.WriteLine(result);