SSH.NET连接成功后抛出SSHConnectionException问题排查
问题排查与解决方案
针对你使用SSH.NET时连接成功但执行命令丢失连接的问题,可从以下几个方向排查:
主机密钥事件绑定错误
你代码中绑定的HostReceived事件名称错误,SSH.NET的正确事件是HostKeyReceived,且语法存在问题。错误的事件处理可能导致连接后续稳定性异常,修正后的写法:client.HostKeyReceived += (sender, e) => { e.CanTrust = true; };注意:生产环境请勿直接信任所有主机密钥,应验证服务器指纹匹配,此写法仅适用于测试场景
代码语法错误引发隐性异常
你的代码存在多处语法问题,这些问题可能导致程序执行流程异常,看似连接成功,实则后续逻辑因错误中断:using(var client new SSHClient(...))缺少赋值符号=,应为using(var client = new SshClient(...))client.Connect()、Console.WriteLine(sshcommand.Result)语句末尾缺少分号- 混合写法
var sshcommand = client.RunCommand(command) or SShCommand sshcommand = ...是无效C#语法,需选择单一正确写法,比如:// 同步执行命令的正确写法 var sshCommand = client.RunCommand("some command"); Console.WriteLine(sshCommand.Result);
服务器端限制或连接超时
- 部分SSH服务器对非交互式连接的命令执行有时间限制,可尝试增加连接超时:
client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(30); - 若服务器要求交互式Shell环境,可尝试通过ShellStream执行命令:
using (var shellStream = client.CreateShellStream("xterm", 80, 24, 800, 600, 1024)) { shellStream.WriteLine("your command"); Thread.Sleep(1000); // 根据命令执行耗时调整等待时间 string output = shellStream.Read(); Console.WriteLine(output); }
- 部分SSH服务器对非交互式连接的命令执行有时间限制,可尝试增加连接超时:
库版本兼容性问题
旧版本SSH.NET可能存在连接稳定性bug,建议通过NuGet更新至最新版本:Install-Package SSH.NET -Version latest网络层面连接中断
- 防火墙或代理可能主动断开空闲连接,可配置心跳包保持连接:
client.KeepAliveInterval = TimeSpan.FromSeconds(10); - 查看服务器端SSH日志(如
/var/log/auth.log),确认是否存在服务器主动断开连接的原因(如权限不足、命令执行失败触发的中断)。
- 防火墙或代理可能主动断开空闲连接,可配置心跳包保持连接:
内容的提问来源于stack exchange,提问作者Emre Polat
相关产品推荐
相关产品推荐

