代码之家  ›  专栏  ›  技术社区  ›  Howard Shane

是否向ping ssh端口添加超时?

  •  -1
  • Howard Shane  · 技术社区  · 7 年前

    我将使用下面的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 回复  |  直到 7 年前
        1
  •  1
  •   ilkkachu CesarB    7 年前

    命令中的括号是子shell的shell语法,但是 timeout 不运行命令,而是通过外壳启动。相反,它直接运行它。它看到了 (: 作为命令名,并尝试运行它,这会导致错误,因为在 PATH .

    您需要在那里添加一个显式shell,如下所示:

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

    第二个命令行出现语法错误,因为 ( ) 是贝壳里的特殊标记。该命令行还将重定向应用于 超时 因此网络连接将在 超时 甚至开始了。

    你可以引用那里的话,即。 timeout ... "(:" 等等,但这只会产生与 timeout ... $SSH_CMD .

    我不确定你是否需要在那里安装子外壳,但你仍然需要在下面运行一个外壳 超时 在超时运行时处理重定向。

        2
  •  -1
  •   Robin Green    7 年前

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

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