Ssh.Net Execute()命令二次调用无返回,C#程序卡死问题排查
SSH.NET二次执行Reboot命令卡死的解决办法
我通过C#应用程序使用SSH.NET库对Yocto远程设备执行两次重启操作,第一次执行正常,设备可正常重启;两次操作间的其他步骤与该问题无关,但第二次调用Exec()命令时无返回,C#程序直接陷入卡死状态。
该功能在远程设备的旧版Yocto发行版中可正常运行,推测是远程设备上的SSH服务器发生变更导致,但不知如何调整C#应用程序解决问题。
原问题代码
public void Reboot() { SshClient sshClient; SshCommand rebootCmd; sshClient.Connect(); string rebootCmdline = "reboot"; rebootCmd = sshClient.CreateCommand(rebootCmdline); try { rebootCmd.Execute(); //第二次执行此处无返回,程序卡死 } catch (SshConnectionException) { } }
命令行测试验证
通过命令行执行ssh user@host 'reboot',两次均能正常触发设备重启,说明设备端SSH服务本身可正常响应该命令。
已验证的解决方案
改用ShellStream替代SshCommand后,服务器可执行命令,且客户端无需等待响应,程序不再卡死。在命令执行与断开连接间添加延时,避免竞态条件:
public void Reboot() { SshClient sshClient; sshClient.Connect(); ShellStream shellStream = this.sshClient.CreateShellStream(string.Empty, 0, 0, 0, 0, 0); shellStream.WriteLine("reboot"); Thread.Sleep(1000); this.SshDisconnect(); }
内容的提问来源于stack exchange,提问作者KDE
相关产品推荐
相关产品推荐

