尝试运行一个脚本,确认本地网络上大量服务器上的日期设置。这些服务器都是本地的,如果运行正常,我预计响应时间小于 1 秒。为了使脚本以有用的速度运行,我希望连接超时尽可能短。
因此我尝试将其作为循环中的主要测试。(IP 地址会变化)
ssh -v -o ConnectTimeout=1 -o ConnectionAttempts=1 10.x.x.x date
对于健康的服务器,这运行良好,但我看到一些框挂起并似乎忽略了超时值。挂起 1 到 2 分钟,而不是我预期的 1 秒。详细输出如下所示。
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /root/.ssh/config
debug1: Applying options for *10.x.x.x*
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to *10.x.x.x* [*10.x.x.x*] port 22.
debug1: fd 3 clearing O_NONBLOCK
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/aws_rsa type -1
debug1: identity file /root/.ssh/aws_rsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
(这里是其停留一至两分钟的地方)
Connection to *10.x.x.x* timed out while waiting to read
我注意到的一个细节是,存在“某种”连接,但连接失败。服务器运行不正常,没有按预期方式响应。我可以选择其他选项来检测这种情况,并在出现协议问题时更快地失败吗?
答案1
来自手册页ssh_config
:
连接超时
指定连接到 SSH 服务器时使用的超时时间(以秒为单位),而不是使用默认的系统 TCP 超时时间。此值仅在目标关闭或确实无法访问时使用,而不是在目标拒绝连接时使用。
从这些行中可能不是很清楚,但超时仅用于connect()
系统调用,基本上在行之前,
debug1: Connection established.
而不是服务器的所有其他响应。为此,有一个选项ServerAliveInterval
,ping
每隔 X 秒检查一次服务器,以确保服务器在连接后响应(默认情况下关闭)。但是,当您的TCPKeepAlive
超时时,您会遇到这种情况,这又是另一个章节。