簡體   English   中英

SSH for循環執行命令腳本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM