View previous topic :: View next topic |
Author |
Message |
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Wed Feb 23, 2011 2:00 pm Post subject: ssh client in (bash) Schleife klappt nicht |
|
|
Ich möchte auf n Rechnern, zu denen ich eine SSH Verbindung aufbauen kann, einen Remote Befehl ausführen. Hier exemplarisch "hostname" um zu sehen auf welchem Rechner der Befehl ausgeführt wird.
Die Liste der Hosts steht in der Datei "all.txt", jeweils ein Host je Zeile. Verbindungsaufbau klappt einzeln dank Schlüsseln sofort und ohne Nutzerinteraktion problemlos.
Allerdings klappt das nicht in folgender Schleife:
Code: | cat all.txt | while read c ; do ssh $c hostname ; done |
Da wird die Schleife ohne Fehlermeldung nach dem ersten Host beendet. Warum? Wie mach ichs richtig? |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5329
|
Posted: Wed Feb 23, 2011 2:05 pm Post subject: |
|
|
Funktioniert die schleife überhaupt richtig?
sprich was wird ausgegeben wenn du folgendes machst?
Code: | cat all.txt | while read c ; do echo "hostname: $c" ; done |
_________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn. |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Wed Feb 23, 2011 3:01 pm Post subject: |
|
|
Dann gibt er alle Hostname aus der Datei aus.
Also ich hatte mal anfangs eine Fehlermeldung, die könnte man so interpretieren das er versucht hat alle Host-Zeilen nach der ersten als Befehl auf dem ersten Host auszuführen. |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5329
|
Posted: Wed Feb 23, 2011 4:13 pm Post subject: |
|
|
also es kommen x-mal "hostname:<zeile aus text datei>" ausgaben? _________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn. |
|
Back to top |
|
|
Finswimmer Bodhisattva
Joined: 02 Sep 2004 Posts: 5467 Location: Langen (Hessen), Germany
|
Posted: Wed Feb 23, 2011 4:16 pm Post subject: |
|
|
Versuch die ssh-Sache mal in einem Extra-Programm zu machen:
cat all.txt | while read c ; do ./execute-remote-script $hostname ; done
Damit sollte es zumindest nicht passieren, dass die folgenden SSH-Kommandos versucht werden auf der ersten Remote-Maschine auszuführen.
in execute-remote-script:
ssh root@$1 /path/to/cmd
Tobi _________________ Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke |
|
Back to top |
|
|
mv Watchman
Joined: 20 Apr 2005 Posts: 6780
|
Posted: Wed Feb 23, 2011 5:50 pm Post subject: |
|
|
Vermutlich versucht ssh selbst von stdin zu lesen. Du musst also für ssh die Standardeingabe umleiten:
Code: | cat all.txt | while read c
do ssh ... </dev/tty
done |
Oder Du benutzt einen anderen Filedescriptor. Dann brauchst Du auch kein useless use of cat:
Code: | exec 3< all.txt && while read c <&3
do ssh ...
done
exec 3<&- |
|
|
Back to top |
|
|
lxg Veteran
Joined: 12 Nov 2005 Posts: 1019 Location: Aachen, Germany
|
Posted: Fri Feb 25, 2011 1:54 pm Post subject: |
|
|
Steht der Befehl (sofern er nicht nur aus einem Wort besteht) denn in Anführungszeichen?
Übrigens, folgende Variante würde ich empfehlen:
Code: | for c in $(cat all.txt); do ssh $c "hostname"; done |
Und zum Testen:
Code: | MYHOST="example.com"; ssh $MYHOST "Befehl mit Parametern" |
_________________ lxg.de – codebits and tech talk |
|
Back to top |
|
|
|