2015-07-10 93 views
1

我写在bash吐出的OpenSSL的版本在我的服务器(checking if I'm protected against this most recent openssl vulnerability)一个少一个衬垫,但如果SSH无法连接和时间它阻止了脚本的其余部分执行。我知道有足够的bash来解决问题,但我不太清楚在这里需要做些什么来强制它继续,也许会陷入SIGTERM并从我离开的地方继续?我敢肯定有一个更简单的方法..xargs的SH -c“SSH ...”停止执行任何时连接超时

这里的命令:

cat servers.txt | \ 
    xargs -I {} sh -c "echo {} && ssh -o ConnectTimeout=3 [email protected]{} openssl version" 

哪里servers.txt只是IP地址的大名单,每行一个

+0

@CharlesDuffy不知道关于xargs,谢谢! – bruchowski

+1

你应该**不要**直接将'{}'扩展为'sh -c'或类似的脚本。这是不安全的。您应该将'{}'作为参数传递给shell,并在shell脚本中使用适当的位置参数。 'xargs'的手册页表明,如果内部进程以退出代码“255”退出,它应该只停止整个执行链。我不希望'ssh'这样做,但也许它在这里。简单地添加'||退出1'到脚本“修复”问题? –

+0

(在另一点上,'sh'是POSIX sh,而不是bash - 即使/ bin/sh是/ bin/bash的链接,它在运行时会关闭一些功能;只是'sh'或当不*显式*使用bash时'shell'是合适的标签)。 –

回答

3

xargs手册页:

如果无法组装命令行,实用程序不能被调用,xargs实用程序立即退出(不处理任何进一步的 输入), 效用的调用由信号终止,或 效用的调用与255

的值推测的故障是与255


个人状态离开退出,我不会为此烦扰xargs;你没有做任何事情(比如并行化,或者在命令行上放置多个主机名),这对你来说特别有用。

while read -r name <&3; do 
    echo "$name"; ssh -o ConnectTimeout=3 [email protected]"$name" "openssl version" ||: 
done 3<servers.txt 

它使用文件描述符3所以标准输入在保留其默认值读取servers.txt文件。


顺便说一句,如果我写代码中使用xargs的,我会做它像这样:

xargs sh -c 'for host; do ssh -o ConnectTimeout=3 [email protected]"$host" "openssl version" </dev/null' _ <servers.txt 

这样,你遇到过xargs的主机的列表到每个shell调用,而不是每个主机一个shell。

+0

真棒,不知道关于xargs,谢谢! – bruchowski

+0

我会改变循环为'在$( anishsane

+0

'do command anishsane

-1

基本上你需要NOHUP

“nohup命令名称&” 或

“的nohup /路径/要/命令名称ARG1 ARG2 &”

您还序列化到服务器。 txt,我想你可能会喜欢 在内容上运行foreach(),在后台运行它们。

但是,这种创造的如何让你的结果是次要问题? (提示:追加到一个固定的命名results.log)

+0

问题不在于xargs在退出时运行的SSH连接,而是由xargs退出创建的SSH连接。 –

0

使用GNU并行这是这样的工作提出:

parallel -j0 --retries 3 --slf servers --nonall --timeout 1000% --tag openssl version 

您需要预先设置“名为myusername @”在线“服务器'或在〜/ .ssh/config中使用'用户myusername'。