背景
有个需求,需要登录到公司所有服务器上运行一个命令取出服务器的某些信息,于是借助ssh就写了个小小的shell脚本如下
#! /bin/bash
while read host
do
echo -n ${host}
echo -n " "
/usr/bin/ssh -i "/usr/home/xxxxxxxx/.ssh/id_rsa" -o 'StrictHostKeyChecking=no' -q root@${host} -p xxxxxx "ls -l"
sleep 1
done < hosts.txt
但是遇到了一个问题,脚本运行只出来一行结果即结束了。
原因及解决
网上搜索后原因如下:
ssh需要从输入终端来读取数据,在第一次循环时,hosts.txt就把整个内容都重定向给了while循环,然后while循环会根据IPS值来切分,每次读取一条记录。然而ssh也会从输入读取数据。当运行到ssh时,它就会把while中剩余的内容当做输入都给吃了,while循环第二次读不到数据就退出了。
解决办法:
把ssh的输入重定向,在命令后面加上</dev/null
。最后脚本如下:
#! /bin/bash
while read host
do
echo -n ${host}
echo -n " "
/usr/bin/ssh -i "/usr/home/xxxxxxxx/.ssh/id_rsa" -o 'StrictHostKeyChecking=no' -q root@${host} -p xxxxxx "ls -l"</dev/null
sleep 1
done < hosts.txt