在 C# 中通过 SSH.NET 的多跳 SSH

Multi hop SSH through SSH.NET in C#

我正在通过 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 是一个 password less ssh。如何控制第二个 SSH 会话并将命令传递给它?

甚至探索了 CreateShell 功能,但似乎不建议将其用于自动化。

一般来说,尝试自动化 ssh 命令是一个糟糕的设计。

您最好使用端口转发(也称为 SSH 隧道)来实现 "hop"。

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 自动化是可以接受的(但仍然不理想)。例如。因为在第一台主机上设置了对第二台主机的身份验证。 IE。 .ssh 文件夹中可能有私钥,您不能将该密钥传输到您的客户端计算机。

即便如此,请尝试与系统管理员交谈以找到更好的解决方案。使用您的应用程序中包含的凭据仍然可以访问私钥,因此如果私钥本身直接包含在应用程序中,它并没有得到更好的保护。

无论如何,ssh 可以在其命令行上接受命令,例如:

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