使用SSH.NET无法连接到SSH服务器。

5
我目前正在尝试使用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”中发生。
附加信息:已建立的连接被主机软件终止。
是否需要更改我的代码?
3个回答

7

如果您是服务器管理员,有一种方法可以限制密钥交换算法为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无法与服务器连接,并且我有一个用户在使用它上传文件。

5
我自己也遇到了这个问题。简而言之,升级到SSH.NET的beta版本即可解决:
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。您可以在Codeplex上查看错误报告(链接:https://sshnet.codeplex.com/workitem/1973)。此外,这位用户在此处经历了类似的问题,升级后问题也得到了解决。

SSH.NET的beta版本似乎存在内存泄漏问题(我今天使用时遇到了问题),请谨慎使用。有一个开放的拉取请求正在解决这个问题:https://github.com/sshnet/SSH.NET/pull/7/files/6b1739d20c3acf7f89bb1380915aeccb67d18552 - Marcos Brigante
@MarcosBrigante,感谢您向社区提供这个信息! - Kirk Woll
我现在正在使用2016版本,仍然面临着同样的问题。 - Badhon Jain

0

RunCommand方法期望从连接的设备获得响应。运行重新启动、关闭电源或关机命令将不允许设备响应,会导致SshConnectionException异常发生。

我在try/catch中包装了这个命令,因为这个异常是可以预料的。以下是C#示例:

try
{
    sshClient.RunCommand("reboot");
}
catch (SshConnectionException exception)
{
    // do something
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接