我有以下bash脚本deploy.sh
:为什么这个while循环不循环?
#!/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 [email protected]$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
。
然而,当我尝试运行它,它只能执行一次迭代:
[email protected]:~$ bash deploy.sh
53.12.45.74
yo
done
[email protected]:~$
为什么?
如果循环很简单:
while read ip user pass; do
echo $ip
done < servers.txt
它并执行所有三个迭代:
[email protected]:~$ bash deploy.sh
53.12.45.74
54.12.45.74
57.12.45.74
[email protected]:~$
这是一个完整的脚本还是真实剧本的代表?如果它是一个代表,你可能忽略了while循环中的break语句。 – alvits
@alvits完成脚本,我只是改变了IP,用户名和密码。 –
看起来'sshpass'正在控制'stdin'或可能替换它并导致'while'循环丢失来自重定向的'stdin'的输入。尝试在'(sshpass -p“$ pass”ssh $ user @ $ ip -o StrictHostKeyChecking = no -T“)子shell中运行'sshpass' echo $ pass | sudo -S sudo /etc/init.d/ganglia -monitor restart “)'并查看问题是否得到解决。 – alvits