在我的bash循环中通过一些服务器的列表,如果ssh连接bash脚本退出

时间:2010-07-09 16:12:31

标签: bash ssh

我有一个快速脚本,可以使用ssh在每台服务器上运行命令(我确信有很多更好的方法可以做到这一点,但它的目的是为了快速工作!!)。对于test1等,没有服务器,所以脚本继续,如果pubkey auth失败,脚本也会继续。但是,如果脚本连接,则打印日期但ssh循环终止...

#!/bin/bash -x

cat <<EOF |
##file servers
test1
test2
server1
server2
EOF
while read line
do
if [ "${line:0:1}" != "#"  ]; then

ssh -q -oPasswordAuthentication=no -i id_dsa user1@${line} date

fi
done

echo read line must have exited

输出就是这样;

+ cat
+ read line
+ '[' t '!=' '#' ']'
+ ssh -q -oPasswordAuthentication=no -i id_dsa user1@test1 date
+ read line
+ '[' t '!=' '#' ']'
+ ssh -q -oPasswordAuthentication=no -i id_dsa user1@test2 date
+ read line1
+ '[' s '!=' '#' ']'
+ ssh -q -oPasswordAuthentication=no -i id_dsa user1@server1 date
Fri Jul  9 09:04:16 PDT 2010
+ read line
+ echo read line must have exited
read line must have exited`enter code here`
与成功返回ssh命令有关的事情是搞乱循环或var的条件......对于为什么有任何建议?

2 个答案:

答案 0 :(得分:9)

你应该将-n标志传递给ssh,以防止它与stdin混淆:

ssh -n -q -oPasswordAuthentication=no -i id_dsa user1@${line} date

我用自己的服务器测试了这个并重现了问题,添加-n解决了它。正如ssh手册页所说:

  

从/ dev / null重定向stdin   (实际上,阻止了阅读   标准输入)

在你的例子中,ssh必须从stdin中读取,这会扰乱你在循环中的读取。

答案 1 :(得分:0)

我认为原因是当你的bash脚本中ssh被分叉并执行时,脚本的标准输入将被重新打开,以便read同时终止。尝试重新制作如下:

for line in test1 test2 server1 server2
do
    if [ "${line:0:1}" != "#"  ]; then
        ssh -q -oPasswordAuthentication=no -i id_dsa user1@${line} date
    fi
done

或者可能在子shell中运行ssh,如下所示:

( ssh -q -oPasswordAuthentication=no -i id_dsa user1@${line} date )