2016-05-12 75 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。

相關問題