2016-12-27 227 views
0

我有一個腳本,從多個服務器獲取服務器的運行狀況是這樣的:SSH for循環執行命令腳本

#!/bin/bash 
for ip 
do 
    ssh 192.168.1.209 ssh [email protected]$ip cat /proc/loadavg | awk '{print $1}' #CPU Usage 
    free | grep Mem | awk '{print $3/$2 * 100.0}' #Memory Usage 
    df -khP | awk '{print $3 "/" $2}' | awk 'FNR == 2' #Disk Space 
    df -kihP | awk '{print $3 "/" $2}' | awk 'FNR == 2' #Inode Space 
    date +'%d %b %Y %r %Z' #Datetime 
    ps -eo user,pid,pcpu,pmem,args|sort -nr -k3|head -5 #Process 
done 

的209表現得象我的網絡上的門戶網站,所以我要ssh到它第一次以訪問其他服務器。通過在終端上鍵入以下命令:

./my_script.sh 192.168.1.210 192.168.1.211 192.168.1.212 

我想從每個服務器獲取每個命令輸出(ps,日期等)。 2臺服務器的期望輸出應該是這樣的:

0.11 #health from server 1 
4.82577 
1.7G/49G 
46K/49M 
27 Dec 2016 05:34:57 PM HKT 
root  93 0.0 0.0 [kauditd] 
root   9 0.0 0.0 [rcuob/0] 
root  8740 0.0 0.0 ifstat --scan=100 
root  829 0.0 0.0 /usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid 
0.00 #health from server 2 
4.82422 
1.7G/49G 
46K/49M 
27 Dec 2016 05:34:57 PM HKT 
root  93 0.0 0.0 [kauditd] 
root   9 0.0 0.0 [rcuob/0] 
root  8740 0.0 0.0 ifstat --scan=100 
root  829 0.0 0.0 /usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid 

的問題,我要面對的是,它好像它只有正從一臺服務器的健康信息。這是爲什麼?是否因爲我不能這樣做SSH?我使用PHP exec()函數來執行腳本btw,以進一步格式化並將其顯示在本地頁面上。

+0

哦,我忘了提及,209就像我的網絡上的門戶。我只能ssh到210,211等從209.所以我實際上SSH到209第一 –

+0

我該怎麼做?我已經給了我所有的代碼 –

回答

1

做,在bash最好的辦法是使用Here Documents <<和運行在每個參數([email protected])循環傳遞給腳本

for ip in "[email protected]" 
do 
    ssh 192.168.1.209 ssh [email protected]"$ip" <<-EOF 
    cat /proc/loadavg | awk '{print $1}' 
    free | grep Mem | awk '{print $3/$2 * 100.0}' 
    df -khP | awk '{print $3 "/" $2}' | awk 'FNR == 2' 
    df -kihP | awk '{print $3 "/" $2}' | awk 'FNR == 2' 
    date +'%d %b %Y %r %Z' 
    ps -eo user,pid,pcpu,pmem,args|sort -nr -k3|head -5 
    EOF 
done 

記住的前導或尾隨空格在標題<<-EOF和最後的EOF之前,使用製表符空格作爲終止標記EOF

您可以運行該腳本現在作爲

./my_script.sh 192.168.1.210 192.168.1.211 192.168.1.212  

而且你可以用腳本的內容在一個簡單的bash腳本,並一次性運行它

#!/bin/bash 

cat /proc/loadavg | awk '{print $1}' 
free | grep Mem | awk '{print $3/$2 * 100.0}' 
df -khP | awk '{print $3 "/" $2}' | awk 'FNR == 2' 
df -kihP | awk '{print $3 "/" $2}' | awk 'FNR == 2' 
date +'%d %b %Y %r %Z' 
ps -eo user,pid,pcpu,pmem,args|sort -nr -k3|head -5 

調用上面的腳本作爲commandlist.sh並調用它的for循環中作爲

ssh 192.168.1.209 ssh [email protected]"$ip" 'bash -s ' < /path-to/commandlist.sh 
+0

我得到./health.sh:第14行:警告:這裏 - 文件在第4行由文件結尾分隔(通緝'EOF') ./health.sh:line 15:語法錯誤:文件意外結束 –

+0

哪行第14行是「完成」行 –

+0

它仍然是一樣的,順便說一句「<< - EOF」應該是「<< EOF」? –

0

嗯,我會做一些完全不同的事情。

#!/bin/bash 
echo "# Health from $(hostname)" 
cat /proc/loadavg | cut -d' ' -f1 #CPU Usage 
free | grep Mem | awk '{print $3/$2 * 100.0}' #Memory Usage 
df -khP | awk 'FNR == 2 {print $3 "/" $2}' #Disk Space 
df -kihP | awk 'FNR == 2 {print $3 "/" $2}' #Inode Space 
date +'%d %b %Y %r %Z' #Datetime 
ps -eo user,pid,pcpu,pmem,args|sort -nr -k3|head -5 #Process 

(MMH ..我會產生非常不同的代碼相同的輸出,但由於:

首先如下(不要忘記,以使其可執行...)我會寫一個腳本commandlist.sh這是你的腳本,我只是編輯了一對夫婦的多餘awk調用的。)

然後,我把它放在209,在這裏我也想安裝GNU parallel。 另外,我會寫出如下文件~/.parallel/sshloginfile

1/192.168.1.210 
1/192.168.1.211 
1/192.168.1.212 

,我會運行命令

ssh 192.168.0.209 parallel -S .. --nonall --bf commandlist.sh ./commandlist.sh 

有在man parallel一個很好看的更多的可能性。