【发布时间】:2015-08-15 08:49:08
【问题描述】:
我在 bash 中写了一小段代码来在我的服务器上吐出 openssl 的版本 (checking if I'm protected against this most recent openssl vulnerability),但是如果 SSH 无法连接并超时,它会阻止脚本的其余部分执行。我知道足够的 bash 来解决,但我不太确定这里需要做些什么来强制它继续,也许会困住 SIGTERM 并从我离开的地方继续?我敢肯定有一个更简单的方法..
命令如下:
cat servers.txt | \
xargs -I {} sh -c "echo {} && ssh -o ConnectTimeout=3 myusername@{} openssl version"
servers.txt 只是一个 IP 地址的大列表,每行一个
【问题讨论】:
-
@CharlesDuffy 不知道 xargs,谢谢!
-
您应该永远将
{}直接扩展为sh -c或类似的脚本。这不安全。您应该将{}作为参数传递给 shell,并在 shell 脚本中使用适当的位置参数。xargs的手册页表明,如果内部进程以退出代码255退出,它应该只停止整个执行链。我不希望ssh这样做,但也许它在这里。是否只是将|| exit 1添加到脚本“修复”问题? -
(在不同的点上,
sh是 POSIX sh,而不是 bash——即使 /bin/sh 是到 /bin/bash 的链接,它在运行时也会关闭一堆功能方式;只有sh或shell是适当的标签,而不是明确 使用bash)。 -
...btw,捕获 SIGTERM 无济于事,因为停止的决定是 在 xargs 内部,而 xargs 不是外壳的一部分——它完全是外部的命令,因此 shell 内的任何信号处理程序都不会改变其行为。
-
@CharlesDuffy 说得通