Führen Sie mehrere Befehle remote mithilfe eines Bash-Skripts aus

Führen Sie mehrere Befehle remote mithilfe eines Bash-Skripts aus

Ich muss mich per SSH bei Remote-Servern anmelden, zum temporären Ordner gehen und dort den RM-Befehl ausführen. Aber wenn ich das folgende Skript ausführe, geht es zum Remote-Server, aber nicht zum temporären Ordner und führt auch nicht den RM-Befehl aus.

#!/bin/bash
for i in `cat list`
echo $server
echo "------------------------------------------"
ssh $server << MYCOMMANDS
cd /tmp
rm log52.log
MYCOMMANDS

Antwort1

Das einzige wirkliche Problem mit Ihrem Code besteht darin, dass in Ihrer Schleife dound fehlen done, was zu Syntaxfehlern führen würde, und dass Sie ials Ihre Schleifenvariable verwenden, aber versuchen, eine Verbindung mit einer serverVariablen herzustellen, die möglicherweise nicht gesetzt ist.

Abgesehen davon verwenden Sie catin einer nicht zitierten Befehlssubstitution, dieallgemeinkeine gute Idee, wenn Sie nicht sicher sind, dass Sie Zeichenfolgen ohne Leerzeichen und Dateinamen-Globbing-Zeichen lesen werden (die meisten Hostnamen verhalten sich in dieser Hinsicht jedoch gut).

Meistens ist es besser, die Eingabe zeilenweise zu lesen, etwa so:

while IFS= read -r remote; do
    ssh -n "$remote" 'rm -f /tmp/log52.log'
done <list

Ich verwende ssh -nhier, um sshdas Lesen des Standardeingabestreams (der mit der listDatei verbunden wäre) zu stoppen. Ohne -nwürde sshder verbleibende Inhalt von gelesen listund Ihre Schleife würde nur eine einzige Iteration ausführen.

Alternativ, wenn Sie die Befehle wirklich aus einem Here-Dokument lesen möchten:

while IFS= read -r remote; do
    ssh -T "$remote" <<'END'
rm -f /tmp/log52.log
END
done <list

Hier verwende ich, ssh -Tum die Pseudoterminalzuweisung explizit zu deaktivieren, was nicht erforderlich ist, da wir nichts tun, was eine Benutzerinteraktion erfordert. Ich mache das, weil sshbemerkt wird, dass sein Standardeingabestrom Daten enthält, und uns daher warnt, dass auf dem Remote-System kein funktionierendes Terminal für interaktive Aufgaben vorhanden ist. Wir brauchen hier nicht, -nda wir den Standardeingabestrom für aus dem Here-Dokument sshneu zuweisen .ssh

Die Schleife könnte aber auch durch den einzelnen Befehl ersetzt werden

xargs -I {} ssh {} 'rm -f /tmp/log52.log' <list

... wo das xargsDienstprogramm liestLinienaus der Datei list, ersetzen Sie {}im sshBefehl durch eine aus der Datei gelesene Zeile und führen Sie die Aktion des Zugriffs auf die Remote-Systeme aus, um die bestimmte Datei zu löschen. Ich verwende, rm -fum keinen Fehler zu verursachen, wenn keine zu löschende Datei vorhanden ist.

Einige Implementierungen xargsermöglichen die parallele Ausführung des Dienstprogramms, zB -P 4(würde höchstens vier gleichzeitige sshBefehle gleichzeitig ausführen).

Antwort2

#! /bin/bash
for i in `cat list`
do
    echo $i
    echo "-------------------------"
    ssh $i "rm /tmp/log52.log"
done

Wenn Sie nur die einzelne Datei entfernen müssen, können Sie das in einer Zeile angeben. Außerdem kann es hilfreich sein, Folgendes -fhinzuzufügen rm.

Antwort3

Sie können die Standardeingabe einer SSH-Sitzung nicht einfach umleiten. Sie sollten eine Fehlermeldung wie diese sehen:

Pseudoterminal wird nicht zugewiesen, da stdin kein Terminal ist

Sie müssen die Option -tt für ssh verwenden, um die Zuweisung eines Pseudotty zu erzwingen. Versuchen Sie Folgendes:

#!/bin/bash
for i in `cat list`
echo $server
echo "------------------------------------------"
ssh -tt $server << MYCOMMANDS
cd /tmp
rm log52.log
MYCOMMANDS

verwandte Informationen