[英]SSH for loop executing command script
我有一個腳本可以從多個服務器獲取服務器的運行狀況,如下所示:
#!/bin/bash
for ip
do
ssh 192.168.1.209 ssh root@$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,date等)。 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,以進一步格式化並將其顯示在我的本地頁面上。
在bash
執行此操作的最佳方法是使用Here Documents <<
,然后對作為參數傳遞給腳本的每個參數( $@
)進行循環
for ip in "$@"
do
ssh 192.168.1.209 ssh root@"$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 root@"$ip" 'bash -s ' < /path-to/commandlist.sh
好吧,我會做完全不同的事情。
首先,我要編寫一個commandlist.sh
腳本,如下所示(不要忘記使其可執行...):
#!/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 ..我將用完全不同的代碼產生相同的輸出,但是由於它是您的腳本,所以我只編輯了幾個多余的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
觀察man parallel
以獲取更多可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.