2016-12-27 1 views
0

ich ein Skript Server Gesundheit von mehreren Servern wie folgt zu erhalten:SSH for-Schleife ausführt Befehlsskript

#!/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 

Der 209 wirkt wie ein Portal in meinem Netzwerk so muss ich es ssh 1. um um auf andere Server zuzugreifen. Durch die Eingabe dieses Befehls auf Terminal:

./my_script.sh 192.168.1.210 192.168.1.211 192.168.1.212 

würde Ich mag von jedem Server jedes der Befehlsausgabe (ps, Datum usw.) erhalten. Erwartete Ausgabe für 2 Server soll wie:

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 

Das Problem, das ich mit Blick auf bin, ist, dass es scheint, als ob es nur ist nur die Gesundheit Informationen von einem Server zu bekommen. Warum das? Liegt es daran, dass ich SSH nicht so machen kann? Ich verwende PHP exec() -Funktion, um das Skript btw auszuführen, um es weiter zu formatieren und auf meiner lokalen Seite anzuzeigen.

+0

oh ich vergaß zu erwähnen, die 209 verhält sich wie ein Portal in meinem Netzwerk. Ich kann nur ssh zu 210.211 usw. von 209. so bin ich eigentlich ssh zu 209 ersten –

+0

wie mache ich das?Ich habe bereits alle meinen Code –

Antwort

1

Die beste Art und Weise, in bash zu tun ist, Here Documents << zu verwenden und eine Schleife über jedes der Argumente ([email protected]) übergeben, um das Skript als

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 

Denken Sie daran, NICHT haben führende oder nachfolgende Leerzeichen laufen vor dem Header <<-EOF und dem letzten EOF, verwenden Sie Tab-Space für den Abschluss EOF.

Sie das Skript jetzt als

./my_script.sh 192.168.1.210 192.168.1.211 192.168.1.212  

Sie können auch wickeln Sie den Inhalt des Skripts in einem einfachen bash Skript und führen Sie es in einem Schuss als

#!/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 

Rufen Sie das obige Skript ausführen können als commandlist.sh und nennen sie im Inneren der for-Schleife als

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

Ich bekomme ./health.sh: Zeile 14: Warnung: Here-Dokument in der Zeile 4 durch Dateiende begrenzt (wollte 'EOF ') ./health.sh: Zeile 15: Syntaxfehler: unerwartetes Ende der Datei –

+0

welche Zeile 14 ist die Zeile "done" –

+0

Es ist immer noch dasselbe, btw "<< - EOF" sollte "<< EOF" sein? –

0

Nun, ich würde etwas ganz anderes machen.

Zuerst würde ich ein commandlist.sh Skript schreiben, wie folgt (nicht ausführbar zu vergessen, es zu machen ...):

#!/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 .. Ich würde die gleiche Leistung mit sehr unterschiedlichen Code erzeugen, aber da Es ist dein Skript Ich habe nur ein paar überflüssige awk Invokationen bearbeitet.)

Dann würde ich es auf der 209 platzieren, wo ich auch GNU parallel installieren würde. Getrennt davon würde ich die Datei ~/.parallel/sshloginfile schreiben wie folgt:

1/192.168.1.210 
1/192.168.1.211 
1/192.168.1.212 

und ich würde den Befehl

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

Haben Sie einen guten Blick auf man parallel für mehr Möglichkeiten führen.

Verwandte Themen