【发布时间】:2016-04-23 10:14:29
【问题描述】:
我有以下 bash 脚本 deploy.sh:
#!/usr/bin/env bash
# Some useful resources:
# while read ip user pass; do : http://unix.stackexchange.com/questions/92664/how-to-deploy-programs-on-multiple-machines
# -o StrictHostKeyChecking=no: http://askubuntu.com/questions/180860/regarding-host-key-verification-failed
# -T: http://stackoverflow.com/questions/21659637/how-to-fix-sudo-no-tty-present-and-no-askpass-program-specified-error
# echo $pass |: http://stackoverflow.com/questions/11955298/use-sudo-with-password-as-parameter
while read ip user pass; do
echo $ip
sshpass -p "$pass" ssh $user@$ip -o StrictHostKeyChecking=no -T "
echo 'yo'
"
echo 'done'
done < servers.txt
servers.txt 包含:
53.12.45.74 my_username my_password
54.12.45.74 my_username my_password
57.12.45.74 my_username my_password
据我了解,while read ip user pass; do […] done < servers.txt 应该遍历servers.txt 的所有三行。
但是,当我尝试运行它时,它只执行一次迭代:
ubuntu@server:~$ bash deploy.sh
53.12.45.74
yo
done
ubuntu@server:~$
为什么?
如果循环很简单:
while read ip user pass; do
echo $ip
done < servers.txt
它确实执行了所有三个迭代:
ubuntu@server:~$ bash deploy.sh
53.12.45.74
54.12.45.74
57.12.45.74
ubuntu@server:~$
【问题讨论】:
-
那是完整的剧本还是真实剧本的代表?如果是代表,你可能忽略了 while 循环中的
break语句。 -
@alvits 完整脚本,我只是更改了 IP、用户名和密码。
-
看来
sshpass正在控制stdin或可能替换它并导致while循环丢失来自重定向stdin的输入。尝试在像(sshpass -p "$pass" ssh $user@$ip -o StrictHostKeyChecking=no -T " echo $pass | sudo -S sudo /etc/init.d/ganglia-monitor restart ")这样的子shell 中运行sshpass,看看问题是否得到解决。 -
@alvits:我认为这是正确的。考虑将其发布为答案。