添加超时ping ssh端口?

时间:2018-05-20 07:10:33

标签: linux bash shell redhat

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

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

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

如果主机没有响应,我将为此命令添加超时支持并使其快速返回(例如,在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'

2 个答案:

答案 0 :(得分:1)

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

你需要在那里添加一个明确的shell,如下所示:

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

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

你可以引用那里的单词,即timeout ... "(:"等,但这只会得到与timeout ... $SSH_CMD相同的结果。

我还不确定你是否需要子shell,但你仍然需要在timeout下运行一个shell,以便在超时运行时处理重定向。

答案 1 :(得分:-1)

在新脚本中调用旧脚本,如下所示:

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