2016-12-27 738 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一个很好看的更多的可能性。