我正在尝试编写一个使用ssh连接进行“心跳”的shell脚本。我想在某个超时后(连接断开后)终止该连接的客户端和服务器端。

到目前为止,我发现了什么:



ssh和sshd的TCPKeepAlive是/否


sshd的ClientAliveCountMax


sshd的ClientAliveInterval


>
ssh的ServerAliveCountMax


ssh的ServerAliveInterval


要更改“ ClientAliveCountMax”,我必须在每个目标上修改sshd_config计算机(默认情况下禁用此选项)。

所以我的问题是-我是否也可以出于自身目的使用“ TCPKeepAlive”(不更改源/目标计算机上的其他任何内容)? >
目标操作系统是SLES11 SP2-但我认为这与这里无关。

评论

这些参数均用于连接处的防火墙或中间设备将终止连接的情况。这些参数用于发送定期数据以保持连接有效,还用于在有X个未完成的答复时关闭连接。您能提供您所做工作的更多细节吗?您正在使用ControlMaster选项并使用从属连接吗?

我只想构建一种方法,使用带有几个物理线路的几个ssh网络连接来确定另一个节点是否“关闭”。我通过打开ssh-session(或多或少会产生无限循环)来完成此操作。如果连接中断,我希望该会话终止。我想知道TCPKeepalive的间隔/计数是多少。

#1 楼

您可能要为此使用ServerAlive设置。它们不需要在服务器上进行任何配置,并且可以根据需要在命令行上进行设置。

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST


这将每5秒发送一次ssh keepalive消息,如果需要发送另一个Keepalive,但未收到对最后一个的响应,则连接将终止。



ServerAliveInterval在TCP层上运行。它发送一个空的TCP ACK数据包。可以将防火墙配置为忽略这些数据包,因此,如果您通过的防火墙丢弃了空闲连接,则这些防火墙可能无法使连接保持活动状态。它实际上将通过ssh发送数据,因此TCP数据包中已加密了数据,并且防火墙无法确定其是否为保持活动或合法数据包,因此它们工作得更好。

评论


我认为这是正确的方向。初步测试表明,此方法可以正常工作-在连接断开后的5秒内,它将终止发送和接收ssh / sshd子进程。我认为TCPKeepalive只是使用TCP-stack-defaults-因此也很难配置。

–指甲
2012年3月15日20:05

这也解决了幻影用户问题。我相信这也可以在PuTTY设置中完成,在“设置” |“设置”下,将keepalive之间的秒数更改为1800。连接。

–鲍勃·斯坦(Bob Stein)
2015年1月14日15:40



@Patrick,“忽略这些数据包”是指“丢弃这些数据包”吗?

–守正
20 Mar 23 '20 at 9:43

不,我的意思是他们不会重置防火墙的“丢弃空闲连接”计时器。防火墙必须允许ACK通过,否则TCP连接将左右中断。

–随钻
20-05-29在1:42

#2 楼

TCPKeepAlive选项实际上是使连接保持活动状态的一种非常不同的方法,类似于ClientAlive或ServerAlive选项。 >
客户端活动消息通过加密的通道发送,因此不会被欺骗。 TCPKeepAlive启用的TCP keepalive选项是可欺骗的。当客户端或服务器依赖于知道连接何时变为非活动状态时,客户端活动机制非常有用。

TCPKeepAlive确保系统是否应将TCP keepalive消息发送到另一端。默认选项始终处于启用状态。

如果使用ClientAliveInterval,则可以禁用TCPKeepAlive。此选项将通过加密通道发送一条消息,以请求客户端响应(默认值为0,因此不会向客户端发送任何消息),并且ClientAliveCountMax设置sshd通过终止连接来断开客户端连接之前客户端活动消息的数量会议。