Folgendes möchte ich tun:
Ich möchte über 100 Hosts überprüfen und sehen, ob auf diesem Host eine Datei vorhanden ist. Wenn die Datei vorhanden ist, möchte ich den Hostnamen und die Ausgabe des Befehls ausdrucken.
Gehen wir in diesem Beispiel davon aus, dass ich drei Hosts habe: host1.example.org host2.example.org host3.example.org . Die Datei /etc/foobar
existiert auf host2.example.org, aber nicht auf host1.example.org oder host3.example.org .
- Ich möchte es
ls -l /etc/foobar
auf jedem Host in der Liste ausführen. - Wenn diese Datei auf diesem Host vorhanden ist, drucken Sie den Hostnamen und die Ausgabe des Befehls.
- Wenn die Datei auf diesem Host nicht vorhanden ist, drucken Sie nichts. Ich möchte den zusätzlichen Lärm nicht.
HOSTLIST="host1.example.org host2.example.org host3.example.org"
for HOST in $HOSTLIST
do
echo "### $HOST"
ssh $HOST "ls -ld /etc/foobar"
done
Das ideale Ergebnis wäre:
### host2.example.org
drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar
Die tatsächliche Ausgabe lautet jedoch:
### host1.example.org
### host2.example.org
drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar
### host3.example.org
Ich möchte nicht, dass die Zeilen für host1.example.org oder host3.example.org gedruckt werden.
Ich experimentiere mit Klammern, um die von echo
und ausgegebene Ausgabe einzuschränken ssh
, aber ich kann die magische Syntax nicht herausfinden, um das zu tun, was ich will. Ich bin sicher, dass ich dies in der Vergangenheit ohne Steuerzeichen getan habe,
HOSTLIST="host1.example.org host2.example.org host3.example.org"
for HOST in $HOSTLIST
do
# If 'ls' shows nothing, don't print $HOST or output of command
# This doesn't work
{ echo "### $HOST" && ssh $HOST "ls -ld /etc/foobar" ; } 2>/dev/null
done
Antwort1
in dieser Ausgabe empfehle ich die Verwendungpss. Danke, pssh, Sie können den Befehl ganz einfach auf mehreren Remote-Servern gleichzeitig ausführen.
Geben Sie den Host ein (z. B. hosts_file) – jeder Server in einer Zeile, z. B.:
host1.tld
host2.tld
Verwendung:
pssh -h hosts_file "COMMAND"
in Ihrem Beispiel wird es sein
pssh -h hosts_file "ls -l /etc/foobar"
Antwort2
Das hat bei mir funktioniert:
for HOST in $HOSTLIST; do
ssh $HOST '[ -f /etc/passwd ] && echo $(hostname) has file'
done
Antwort3
set -- host1.example.org host2.example.org
for host; do
ssh "$host" sh -c '[ -e /etc/foobar ] && { printf %s\\n "$1"; ls -ld /etc/foobar; }' _ "$host"
done
Antwort4
for host in host1 host2 host3 ;do ssh $host 'echo -n "[$(hostname -s)]"; /sbin/ifconfig |grep Bcast' ;done
[host1] inet addr:xxx.xxx.138.30 Bcast:xxx.xxx.143.255 Mask:255.255.248.0 [host2] inet addr:xxx.xxx.138.14 Bcast:xxx.xxx.143.255 Mask:255.255.248.0 [host3] inet addr:xxx.xxx.82.146 Bcast:xxx.xxx.82.255 Mask:255.255.255.128