SSH连接无法断开

时间:2016-08-30 14:13:21

标签: ssh docker net-ssh

我有一个长时间运行的进程(有时> 2小时)打开SSH连接(ruby' Net::SSH库),运行命令,然后关闭连接。这在我们的旧VM环境中运行良好。我刚刚将代码移植到GKE中的Docker镜像,现在SSH连接被卡住了。这似乎只发生在运行时间超过30分钟的工作中。

我已经检查了两端,并且在远程/服务器端(/var/log/secure)我可以看到已建立连接,会话已打开,然后会话已关闭。使用netstat -a,我可以看到不再列出连接。但是在本地/客户端,netstat -a显示连接仍然​​是" ESTABLISHED"。出于某种原因,它没有收到断开连接的通知。

鉴于这适用于一个环境,而不是另一个环境,我不会认为问题出现在Net::SSH中,而是在某些不同的配置或某些网络中不同。

我尝试在客户端代码中添加keep-alive(认为keep-alive会触发客户端检测服务器何时不再连接),但这似乎使得没有区别:

  Net::SSH.start(Settings.ssh.host, Settings.ssh.user, options) do |ssh|
    ssh.send_global_request("keep-alive@openssh.com")
    response = ssh.exec!(cmd)
  end

同样,我更新了服务器上的sshd以包含keep-alive(per this SO answer),但似乎并没有解决它:

TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 3

1 个答案:

答案 0 :(得分:0)

好吧,似乎设置服务器配置以保持客户端连接活动解决了这个问题。所以将它添加到服务器端:

TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 3

我已经重新加载了sshd服务器(/etc/init.d/sshd reload),但似乎没有做到这一点。重新启动服务器(/etc/init.d/ssh restart)似乎确实有所不同。