如何在多台计算机上批量运行多个SSH远程命令?

Jav*_*Red 13 ssh shell for-loop timeout

我使用SSH在for循环中的多个远程机器上运行一些命令.它为IP地址列表执行相同的命令.某些IP地址可能无法访问,因此我使用了该ConnectTimeout选项.

但是,我的脚本没有按照我想要的方式工作.实际上它停留在第一个无法访问的IP而不是放弃并尝试列表中的下一个IP地址.

这是我的脚本的相关部分:

for ip in ${IP} ; do
    ssh  -o BatchMode=yes \
         -o StrictHostKeyChecking=no \
         -o ConnectTimeout=10 \
         -l ${USERNAME} \
         ${SCRIPT_HOST} \
         "${COMMAND} -i $ip || echo timeout" \
         >> ./myscript.out
done
Run Code Online (Sandbox Code Playgroud)

它对于可访问的IP工作正常,但是如果特定的IP已关闭,它会等待一段时间(远超过10秒,可能是35-40秒)并向我的终端显示错误消息:

ERROR connecting : Connection timed out

所以我想知道我没有正确使用哪个选项.

Sig*_*igi 15

你的使用ConnectTimeout是正确的,所以不明显为什么它只在30秒或更长时间后超时.

以下是我将如何更改脚本以完全避免超时问题:

  • 使用GNU parallel同时连接到多个目标主机.
  • 使用-fSSH选项在后台处理它.

这是一个GNU并行解决方案,同时运行最多50个连接:

parallel --gnu --bg --jobs 50 \
ssh -o BatchMode=yes \
    -o StrictHostKeyChecking=no \
    -o ConnectTimeout=10 \
    -l ${USERNAME} \
    {} \
    "${COMMAND} -i {} || echo timeout" \
::: ${IP}
Run Code Online (Sandbox Code Playgroud)

parallel <command> ::: <arguments><command> <argument>通过拆分<arguments>列表并行执行多次.占位符<argument>{}.

使用parallel --jobs n限制并行连接的数量.