2016-12-27 4 views
0

У меня есть сценарий, чтобы получить здоровье сервера с нескольких серверов, как это:SSH для выполнения команд цикла сценария

#!/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 к нему 1, чтобы для доступа к другим серверам. Введя эту команду на терминале:

./my_script.sh 192.168.1.210 192.168.1.211 192.168.1.212 

Я хотел бы получить каждый из выходных данных команды (пс, дата и т.д.) с каждого сервера. Ожидаемый результат 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, и назовите его внутри петли, как

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 - это строка «done» –

+0

. Все равно, btw «<< - EOF» должно быть «<< EOF»? –

0

Ну, я бы сделал совсем другое.

Сначала я бы написать сценарий 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 

(ММХ .. Я хотел бы производить тот же результат с очень разными кодами, но так как это ваш сценарий. Я только отредактировал несколько лишних выводов 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 для больше возможностей.

Смежные вопросы