将超时添加到 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.
时处理
我将使用下面的 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.