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 do
und fehlen done
, was zu Syntaxfehlern führen würde, und dass Sie i
als Ihre Schleifenvariable verwenden, aber versuchen, eine Verbindung mit einer server
Variablen herzustellen, die möglicherweise nicht gesetzt ist.
Abgesehen davon verwenden Sie cat
in 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 -n
hier, um ssh
das Lesen des Standardeingabestreams (der mit der list
Datei verbunden wäre) zu stoppen. Ohne -n
würde ssh
der verbleibende Inhalt von gelesen list
und 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 -T
um die Pseudoterminalzuweisung explizit zu deaktivieren, was nicht erforderlich ist, da wir nichts tun, was eine Benutzerinteraktion erfordert. Ich mache das, weil ssh
bemerkt 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, -n
da wir den Standardeingabestrom für aus dem Here-Dokument ssh
neu 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 xargs
Dienstprogramm liestLinienaus der Datei list
, ersetzen Sie {}
im ssh
Befehl 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 -f
um keinen Fehler zu verursachen, wenn keine zu löschende Datei vorhanden ist.
Einige Implementierungen xargs
ermöglichen die parallele Ausführung des Dienstprogramms, zB -P 4
(würde höchstens vier gleichzeitige ssh
Befehle 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 -f
hinzuzufü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