在 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);
我正在通过 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);