将超时添加到 ping ssh 端口?

Add timeout to ping ssh port?

我将使用下面的 bash 脚本来 ping 远程主机的 SSH 端口,它运行正常:

(: </dev/tcp/$vm_ip/22) &>/dev/null

现在在某些主机中,由于主机已关闭,此命令将花费很长时间(例如 3 分钟)来报告失败。

我将为此命令添加超时支持,并在主机没有响应的情况下使其快速 return(例如,return 在 5 秒内)。

SSH_CMD="(: </dev/tcp/$vm_ip/22) &>/dev/null"
timeout --preserve-status 5 $SSH_CMD

但是上面会输出错误:

timeout: failed to run command ‘(:’: No such file or directory

你能帮我解决这个问题吗?

==编辑 1==================

尝试像这样更改代码(未定义变量):

timeout --preserve-status 2 (: </dev/tcp/$vm_ip/22) &>/dev/null

失败是:

./test.sh: line 45: syntax error near unexpected token `('
./test.sh: line 45: `   timeout --preserve-status 2 (: </dev/tcp/$vm_ip/22) &>/dev/null'

像这样在新脚本中调用旧脚本:

timeout --preserve-status 5 name-of-old-script

您命令中的括号是 shell 子语法 shell,但 timeout 不是 运行 它通过 [=31= 开始的命令].相反,它直接 运行s 它。它将 (: 视为命令名称并尝试 运行 它,这会导致错误,因为您不太可能在 PATH.

中使用这样的命令

您需要在此处添加明确的 shell,如下所示:

timeout --preserve-status 5 bash -c "(: </dev/tcp/$vm_ip/22) &>/dev/null"

您的第二个命令行给出语法错误,因为 () 是 shell 中的特殊标记。该命令行还将重定向应用到 timeout 本身,因此网络连接甚至会在 timeout 启动之前打开。

您可以在此处引用单词,即 timeout ... "(:" 等,但这只会给出与 timeout ... $SSH_CMD.

相同的结果

我不太确定你是否需要 subshell,但你仍然需要 运行 timeout 下的 shell 才能进行重定向在超时为 运行ning.

时处理