2016-05-12 76 views
3

最初的想法是将脚本复制到每个IP地址,然后在每台计算机上执行yum-install一些RPM和一些配置步骤。由于yum-install需要大约20分钟,所以希望在每台机器上同时安装,然后等待所有产生的进程完成后再继续。在远程计算机上执行同步脚本,并等待处理完成

#!/bin/bash 

PEM=$1 
IPS=$2 

for IP in IPS; do 
    scp -i $PEM /tmp/A.sh [email protected]:/tmp 
    ssh -i $PEM [email protected]$IP chmod 777 /tmp/A.sh 
done 

for IP in IPS; do 
    ssh -t -i $PEM [email protected]$IP sudo /tmp/A.sh & 
done 

wait 
echo "IPS have been configured." 
exit 0 

在后台对三个IP地址执行远程sudo执行命令会产生三条错误消息。显然,我的逻辑存在缺陷。

Pseudo-terminal will not be allocated because stdin is not a terminal. 
Pseudo-terminal will not be allocated because stdin is not a terminal. 
Pseudo-terminal will not be allocated because stdin is not a terminal. 
sudo: sorry, you must have a tty to run sudo 
sudo: sorry, you must have a tty to run sudo 
sudo: sorry, you must have a tty to run sudo 

所有机器都的CentOS 6.5

+1

请参阅https://unix.stackexchange.com/questions/122616/why-do-i-need-a-tty-to-run-sudo-if-i-can-sudo-without-a-password – andlrc

+0

谢谢。但是,问题不在于执行sudo命令,而在于在远程系统上执行后台命令。如果没有“&”,脚本就可以正常工作,但命令执行是顺序的。我试图分叉一个进程,以便在多个远程机器上同时执行。 – user2569618

+0

所以,让我明白这一点:你有N台机器,你想通过ssh同时运行一个命令,并且你想等所有的终端都结束? – louigi600

回答

0

只是为了推动你一些devopsy学说。

Ansible做得非常好。

+0

是的,Ansible,Puppet和Chef会很好地完成这项工作。但是因为我在Bash,所以我希望能继续在Bash。我发现“pssh”会创建并行的ssh作业,并等待所有重生作业返回。 – user2569618

1

你需要告诉SSH不从标准输入

ssh -n -t [email protected] "sleep 100" & 

阅读下面是一个例子

[email protected]:/tmp$ cat a 
date 
ssh -n -t [email protected] "sleep 100" & 
ssh -n -t [email protected] "sleep 100" & 
wait 
date 
darkstar:/tmp$ . ./a 
Mon May 16 15:32:16 CEST 2016 
Pseudo-terminal will not be allocated because stdin is not a terminal. 
Pseudo-terminal will not be allocated because stdin is not a terminal. 

[1]- Done     ssh -n -t [email protected] "sleep 100" 
[2]+ Done     ssh -n -t [email protected] "sleep 100" 
Mon May 16 15:33:57 CEST 2016 
darkstar:/tmp 

,在所有101秒等待。显然我有ssh密钥,所以我没有从密码提示。

但看着你的输出,它看起来像远程机器上的sudo失败......你可能甚至不需要-n。

相关问题