【发布时间】:2011-02-19 14:36:42
【问题描述】:
我正在尝试将 SSH 端口转发构建到我正在编写的 .NET 应用程序中。
我尝试过使用sharpSSH,但它要求用户每次都输入密码,我不希望这样。我将处理存储密码。
我已经下载了Granados,但它的文档基本上为零。如何使用 Granados 或任何其他适用于 .NET 的免费 SSH 库完成端口转发?
【问题讨论】:
标签: c# .net networking ssh portforwarding
我正在尝试将 SSH 端口转发构建到我正在编写的 .NET 应用程序中。
我尝试过使用sharpSSH,但它要求用户每次都输入密码,我不希望这样。我将处理存储密码。
我已经下载了Granados,但它的文档基本上为零。如何使用 Granados 或任何其他适用于 .NET 的免费 SSH 库完成端口转发?
【问题讨论】:
标签: c# .net networking ssh portforwarding
SSH.NET library 是实现此目的的简单方法:
using (var client = new SshClient("client.net", "user", "password"))
{
client.Connect();
var port = new ForwardedPortLocal("localhost", 10000, "remote.net", 80);
client.AddForwardedPort(port);
port.Exception += delegate(object sender, ExceptionEventArgs e)
{
Console.WriteLine(e.Exception.ToString());
};
port.Start();
// ... hold the port open ... //
port.Stop();
client.Disconnect();
}
【讨论】:
localhost离开端口ForwardedPortLocal调用——缺点是任何IP都可以连接到SSH服务器在端口 10000 上,它将被转发到 remote.net:80。如果在您的情况下这不是安全问题,那么您很好 - 否则您需要找出您的本地主机名或 IP 并将其而不是 localhost。
如果您在 SSH 服务器上远程设置了 DSA 密钥,您可以为用户保存一个密钥(一次性完成),然后作为授权用户将该密钥保存在服务器上。
【讨论】:
这些 C# 替代方案均源自 JCraft 的 Java Jsch:
Granados product page 链接到 Poderosa 项目,其中包括 PortForwarding plugin。那里的channel.cs 和connectionmanager.cs 文件的source code 似乎实现了端口转发。请参阅a recommendation 的此答案。
Nsch 似乎是 MonoDevelop 的 NGit 中隐藏的宝石;它是来自 Jsch 的 mostly-automatically converted (background info)。
Further research 于 2011 年 2 月由 Sumatra PDF 的Krzysztof Kowalczyk 撰写。
【讨论】:
虽然文档记录不佳 - 或者至少文档让我无法理解 - 这似乎能够处理 SSH 连接,包括文件传输和端口转发:https://github.com/sshnet/SSH.NET
【讨论】:
这是一种无需提升任何parameters: (全自动端口转发)的方法,使用SharpSSH
(用户、主机、Lport、Rhost、Rport、DSA-key-confirmation、密码)
Dim JJ As Tamir.SharpSsh.jsch.JSch = New Tamir.SharpSsh.jsch.JSch()
Dim sess As Tamir.SharpSsh.jsch.Session = JJ.getSession("user", "remoteadd.dydns.com")
Dim conf As Hashtable = New Hashtable()
conf.Add("StrictHostKeyChecking", "no")
sess.setConfig(conf)
sess.setPassword("password")
sess.connect()
sess.setPortForwardingR(45, "127.0.0.1", 256)
【讨论】: