无法使用 SSH.NET 连接到 SSH 服务器
Unable to connect to SSH server using SSH.NET
我目前正在尝试使用 Visual Basic 和 SSH.NET 为我的 Linux 服务器制作类似控制面板的程序。现在,我想在按下按钮时让 Linux 机器重新启动。
这是我目前的情况:
Dim connInfo As New Renci.SshNet.PasswordConnectionInfo("IP", "USERNAME", "PASSWORD")
Dim sshClient As New Renci.SshNet.SshClient(connInfo)
Dim cmd As Renci.SshNet.SshCommand
Private Sub MaterialFlatButton1_Click(sender As Object, e As EventArgs) Handles MaterialFlatButton1.Click
Using sshClient
sshClient.Connect()
cmd = sshClient.RunCommand("reboot")
sshClient.Disconnect()
End Using
End Sub
当我按下按钮时,我得到的错误是:
'Renci.SshNet.Common.SshConnectionException' 类型的未处理异常发生在 Renci.SshNet.dll
其他信息:已建立的连接被您主机中的软件中止。
我的代码有什么需要更改的吗?
我自己也遇到过同样的问题。 tl;博士:upgrade to the beta version of SSH.NET:
Install-Package SSH.NET -Pre
进一步阐述
如果您在尝试连接失败后立即检查 linux 服务器上的日志:
grep 'sshd' /var/log/auth.log
您可能会看到这样一行:
sshd[2467]: fatal: mm_answer_moduli: bad parameters: 2048 2048 1024
最近版本的 ssh 服务器变得更加严格,SSH.NET 当前(稳定)版本不支持此功能。更具体地说,它通过要求大于 1024 的密钥大小而变得更加严格。您可以查看错误报告 on codeplex. And here's 一个遇到类似问题的人升级也有效。
如果您是服务器管理员,可以选择将密钥交换算法限制为 diffie-hellman-group1-sha1。重要的是要注意此算法不再被认为是安全的,但 Open SSH 支持它。
为此,请转到您的 linux 服务器并编辑文件
/etc/ssh/sshd_config
添加行(在文件中间的某处)
# Disable all Kex Algorithms but the one defined below (so Renci SSH.NET 2013 works)
KexAlgorithms diffie-hellman-group1-sha1
重新启动 ssh:
sudo service ssh stop
sudo service ssh start
现在 SSH.NET 可以工作了,但是要通过 ssh(终端)连接到服务器,您应该在客户端配置文件中定义协议:
编辑文件(我在 cygwin 上使用 ssh,其他客户端不在我的知识范围内)
~/.ssh/config
添加行
KexAlgorithms +diffie-hellman-group1-sha1
总结一下,我最终没有使用这个解决方案,因为最新的 filezilla 没有连接到服务器,我有一个用户使用它来上传文件。
RunCommand 方法需要来自已连接设备的响应。 运行 reboot、poweroff 或 shutdown 命令将不允许设备响应并导致发生 SshConnectionException。
我将此命令包装在 try/catch 中,因为此异常是预期的。这是 C# 中的示例:
try
{
sshClient.RunCommand("reboot");
}
catch (SshConnectionException exception)
{
// do something
}
我目前正在尝试使用 Visual Basic 和 SSH.NET 为我的 Linux 服务器制作类似控制面板的程序。现在,我想在按下按钮时让 Linux 机器重新启动。
这是我目前的情况:
Dim connInfo As New Renci.SshNet.PasswordConnectionInfo("IP", "USERNAME", "PASSWORD")
Dim sshClient As New Renci.SshNet.SshClient(connInfo)
Dim cmd As Renci.SshNet.SshCommand
Private Sub MaterialFlatButton1_Click(sender As Object, e As EventArgs) Handles MaterialFlatButton1.Click
Using sshClient
sshClient.Connect()
cmd = sshClient.RunCommand("reboot")
sshClient.Disconnect()
End Using
End Sub
当我按下按钮时,我得到的错误是:
'Renci.SshNet.Common.SshConnectionException' 类型的未处理异常发生在 Renci.SshNet.dll
其他信息:已建立的连接被您主机中的软件中止。
我的代码有什么需要更改的吗?
我自己也遇到过同样的问题。 tl;博士:upgrade to the beta version of SSH.NET:
Install-Package SSH.NET -Pre
进一步阐述
如果您在尝试连接失败后立即检查 linux 服务器上的日志:
grep 'sshd' /var/log/auth.log
您可能会看到这样一行:
sshd[2467]: fatal: mm_answer_moduli: bad parameters: 2048 2048 1024
最近版本的 ssh 服务器变得更加严格,SSH.NET 当前(稳定)版本不支持此功能。更具体地说,它通过要求大于 1024 的密钥大小而变得更加严格。您可以查看错误报告 on codeplex. And here's 一个遇到类似问题的人升级也有效。
如果您是服务器管理员,可以选择将密钥交换算法限制为 diffie-hellman-group1-sha1。重要的是要注意此算法不再被认为是安全的,但 Open SSH 支持它。
为此,请转到您的 linux 服务器并编辑文件
/etc/ssh/sshd_config
添加行(在文件中间的某处)
# Disable all Kex Algorithms but the one defined below (so Renci SSH.NET 2013 works)
KexAlgorithms diffie-hellman-group1-sha1
重新启动 ssh:
sudo service ssh stop
sudo service ssh start
现在 SSH.NET 可以工作了,但是要通过 ssh(终端)连接到服务器,您应该在客户端配置文件中定义协议:
编辑文件(我在 cygwin 上使用 ssh,其他客户端不在我的知识范围内)
~/.ssh/config
添加行
KexAlgorithms +diffie-hellman-group1-sha1
总结一下,我最终没有使用这个解决方案,因为最新的 filezilla 没有连接到服务器,我有一个用户使用它来上传文件。
RunCommand 方法需要来自已连接设备的响应。 运行 reboot、poweroff 或 shutdown 命令将不允许设备响应并导致发生 SshConnectionException。
我将此命令包装在 try/catch 中,因为此异常是预期的。这是 C# 中的示例:
try
{
sshClient.RunCommand("reboot");
}
catch (SshConnectionException exception)
{
// do something
}