我使用 ssh 登录到另一个系统并在那里执行脚本来创建新机器,并进行一些设置。大约需要7-8小时。所以发生的事情是,ssh 连接不断断开,并且我总是因脚本执行失败而超时。
所以现在我将这个参数与 ssh 连接一起使用:
ssh -o ServerAliveInterval=60 user@host ....
此 ssh 会生成多次。问题是在几次 ssh 连接后,我收到错误:
too many logins of user
并且 ssh 连接在成功登录后立即关闭。
的行为也是如此吗服务器活动间隔,即使在 ssh 工作结束后,远程计算机中的 ssh 用户登录会话仍保持活动状态,这就是为什么我的进一步登录被断开的原因?
答案1
如果您的客户端失去连接,我认为这不会使会话保持活动状态。可能是服务器端的那些选项:
最大客户端存活数
设置在 sshd(8) 没有从客户端接收到任何消息的情况下可以发送的客户端活动消息的数量。如果在发送客户端活动消息时达到此阈值,sshd 将断开客户端连接,终止会话。需要注意的是,客户端活动消息的使用与 TCPKeepAlive 有很大不同。客户端活动消息通过加密通道发送,因此不会被欺骗。 TCPKeepAlive 启用的 TCP keepalive 选项是可欺骗的。当客户端或服务器依赖于了解连接何时变为非活动状态时,客户端活动机制非常有价值。
默认值为 3。如果 ClientAliveInterval 设置为 15,并且 ClientAliveCountMax 保留为默认值,则无响应的 SSH 客户端将在大约 45 秒后断开连接。
客户端活动间隔
设置超时间隔(以秒为单位),在此之后如果没有从客户端接收到数据,sshd(8) 将通过加密通道发送消息以请求客户端响应。默认为0,表示这些消息不会发送到客户端。
也许问题的真正解决方案在于使用终端多路复用器(例如 screen 或 tmux)。即使您的连接断开,它们也能让您的登录和正在运行的程序持续存在。您可以在以后的任何时候重新连接到终端,包括正在运行的程序输出。您还可以使用它在单个 ssh 连接中拥有多个终端。由于您的服务器似乎限制了您的 ssh 会话,因此这也可能很有用。你可以找到一个屏幕介绍在这里,但还有很多其他的。
答案2
ServerAliveInterval
那么,即使 ssh 工作结束后,远程计算机中的 ssh 用户登录会话仍保持活动状态,这就是我的进一步登录被断开的原因吗?
不会。这是发送 keepalive 消息来检查您的连接并防止在 SSH 或较低级别中自动断开连接。如果您想启动长时间运行的脚本,您应该在远程端使用nohup
,screen
或。tmux
即使在断开连接后,它也会使您的脚本保持运行,并且使用后两个终端,您可以重新连接现有终端。
答案3
启用后您可能会收到这些错误,ServerAliveInterval=60
因为您的连接仍在运行。您对该服务器的 ssh 连接/命令模式累积的并发连接数超出了服务器配置允许的数量。
您的连接曾经消失,导致同时连接的数量减少,服务器对此很满意(没有拒绝的连接),但您不高兴。
找出服务器关于最大同时连接数的配置,然后保持在该限制内,或者与服务器管理员协商以提高您(甚至可能是每个人)的限制。