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秒或更长时间后超时.
以下是我将如何更改脚本以完全避免超时问题:
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限制并行连接的数量.