Einen Befehl auf mehreren Hosts ausführen, aber den Befehl nur drucken, wenn er erfolgreich ist?

Einen Befehl auf mehreren Hosts ausführen, aber den Befehl nur drucken, wenn er erfolgreich ist?

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/foobarexistiert auf host2.example.org, aber nicht auf host1.example.org oder host3.example.org .

  1. Ich möchte es ls -l /etc/foobarauf jedem Host in der Liste ausführen.
  2. Wenn diese Datei auf diesem Host vorhanden ist, drucken Sie den Hostnamen und die Ausgabe des Befehls.
  3. 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 echound 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

verwandte Informationen