具有 SSH.net 的 C# SSH 端口转发
本文关键字:SSH 转发 net 具有 | 更新日期: 2023-09-27 18:34:04
我正在尝试在带有 SSH.NET 的C#程序中执行以下操作:
ssh -NfD 1080 username@remote.com
这是我生成的代码:
using (var client = new SshClient("remote.com", "username", "password"))
{
client.Connect();
var port = new ForwardedPortLocal("localhost", 1080, "remote.com", 1080);
client.AddForwardedPort(port);
port.Exception += delegate(object sender, ExceptionEventArgs e)
{
Console.WriteLine(e.Exception.ToString());
};
port.Start();
}
Console.ReadKey();
我通过这条隧道连接到OpenVPN服务器。当我使用命令行时,它工作正常,但是当我使用 C# 程序时,即使我可以将命令发送到我通过 C# 程序连接到的服务器,隧道也不起作用。知道吗?
Console.ReadKey(); 应放置在 using 块中,以确保不会释放 SshClient 实例。
static void Main(string[] args)
{
using (var client = new SshClient("host", "name", "pwd"))
{
client.Connect();
var port = new ForwardedPortDynamic(7575);
client.AddForwardedPort(port);
port.Exception += delegate (object sender, ExceptionEventArgs e)
{
Console.WriteLine(e.Exception.ToString());
};
port.Start();
Console.ReadKey();
}
}
正如我在评论中建议的那样,我认为您可以尝试以这种方式使用client.RunCommand
方法执行命令
client.RunCommand("some command");
由于论坛
(链接)上的da_rinkes,我找到了答案 SSH.NET。
我使用的是ForwardedPortLocal而不是ForwardedPortDynamic(带有ssh命令的-D选项)。
这是新代码:
public void Start()
{
using (var client = new SshClient("remote.com", "username", "password"))
{
client.KeepAliveInterval = new TimeSpan(0, 0, 30);
client.ConnectionInfo.Timeout = new TimeSpan(0, 0, 20);
client.Connect();
ForwardedPortDynamic port = new ForwardedPortDynamic("127.0.0.1", 1080);
client.AddForwardedPort(port);
port.Exception += delegate(object sender, ExceptionEventArgs e)
{
Console.WriteLine(e.Exception.ToString());
};
port.Start();
System.Threading.Thread.Sleep(1000 * 60 * 60 * 8);
port.Stop();
client.Disconnect();
}
this.Start();
}
仍然必须找到另一种方法来保持SSH隧道正常运行(而不是每8小时进行一次Sleep +递归调用)。
代表提问者发布