在C#中通过SSH.NET进行多跳SSH

时间:2018-02-13 04:47:56

标签: c# .net ssh ssh.net

我正在使用SSH连接到Linux机器,并且再次从那里想要通过SSH连接到另一台Linux机器来执行几个Perforce任务。

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 个答案:

答案 0 :(得分:3)

通常,尝试自动执行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);