Ich habe einen lokalen Computer, der eine SSH-Sitzung zu einem Remote- master
Computer und dann eine weitere innere SSH-Sitzung von master
jedem zu einem Remote- Computer durchführen und dann slaves
zwei Befehle ausführen soll, dh ein bestimmtes Verzeichnis löschen und neu erstellen.
Beachten Sie, dass der lokale Computer ein passwortloses SSH für den Master und der Master ein passwortloses SSH für die Slaves hat. Außerdem sind alle Hostnamen in .ssh/config
den lokalen / Master-Maschinen bekannt und die Hostnamen der Slaves sind slaves.txt
lokal und ich lese sie von dort.
Was ich also mache und arbeite, ist Folgendes:
username="ubuntu"
masterHostname="myMaster"
while read line
do
#Remove previous folders and create new ones.
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition""
ssh -n $username@$masterHostname "ssh -t -t $username@$line "mkdir -p EC2_WORKSPACE/$project Input Output Partition""
#Update changed files...
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rsync --delete -avzh /EC2_NFS/$project/* EC2_WORKSPACE/$project""
done < slaves.txt
Dieser Cluster befindet sich auf Amazon EC2, und ich habe festgestellt, dass bei jeder Iteration 6 SSH-Sitzungen erstellt werden, was zu einer erheblichen Verzögerung führt. Ich möchte diese 3 Befehle zu 1 kombinieren, um weniger SSH-Verbindungen zu erhalten. Also habe ich versucht, die ersten beiden Befehle zu kombinieren
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input Output Partition""
Aber es funktioniert nicht wie erwartet. Es scheint das erste ( rm -rf Input Output Partition
) auszuführen und verlässt dann die Sitzung und fährt fort. Was kann ich machen?
quelle
-J
Option verwenden, die Ihren Sprunghost definiert.Antworten:
Betrachten Sie das
&&
als logischen Operator. Es bedeutet nicht "auch diesen Befehl ausführen", sondern "diesen Befehl ausführen, wenn der andere erfolgreich war".Das heißt, wenn der
rm
Befehl fehlschlägt (was passiert, wenn eines der drei Verzeichnisse nicht vorhanden ist),mkdir
wird der Befehl nicht ausgeführt. Dies klingt nicht nach dem gewünschten Verhalten. Wenn die Verzeichnisse nicht vorhanden sind, ist es wahrscheinlich in Ordnung, sie zu erstellen.Benutzen
;
Das Semikolon
;
wird zum Trennen von Befehlen verwendet. Die Befehle werden nacheinander ausgeführt und warten jeweils, bevor sie mit dem nächsten fortfahren. Ihr Erfolg oder Misserfolg hat jedoch keine Auswirkungen aufeinander.Entkomme inneren Zitaten
Anführungszeichen in anderen Anführungszeichen sollten maskiert werden, andernfalls erstellen Sie einen zusätzlichen Endpunkt und Startpunkt. Ihr Befehl:
Wird:
Ihr aktueller Befehl sollte aufgrund des Mangels an maskierten Anführungszeichen Folgendes ausführen:
wenn das gelingt:
Sie werden feststellen, dass die Syntaxhervorhebung den gesamten Befehl hier rot anzeigt. Dies bedeutet, dass der gesamte Befehl die Zeichenfolge ist, die an ssh übergeben wird. Überprüfen Sie Ihren lokalen Computer. Möglicherweise haben Sie die Verzeichnisse
Input
Output
undPartition
wo Sie dies ausgeführt haben.quelle
&
Befehle werden im Hintergrund ausgeführt, was bedeutet, dass nicht darauf gewartet werden muss, bis sie beendet sind, bevor mit dem nächsten fortgefahren wird.Sie können in Ihrer Jumpbox Multiplexing jederzeit in OpenSSH definieren
Dafür tun Sie in
/etc/ssh/ssh_config
:Auf diese Weise werden alle aufeinanderfolgenden Verbindungen, die in den folgenden 30 Minuten zum selben Server hergestellt wurden, wieder verwendet, wobei die vorherige SSH-Verbindung wiederverwendet wird.
Sie können es auch für eine Maschine oder eine Gruppe von Maschinen definieren. Entnommen aus dem angegebenen Link.
quelle
/tmp/
.man ssh
,ControlPath
,ControlMaster
undControlPersist
sind gültige Optionen einen passierenssh
mit dem Befehl-o
. Könnte ein noch genauerer Anwendungsfall sein, richten Sie das Multiplexing im erstenssh
Teil des Skripts ein und recyceln Sie es für die anderen, aber vermeiden Sie ansonsten die Leistungseinbußen. Ich frage mich, was der Maßstab für das Multiplexen von VS nicht für 3 SSH-Verbindungen ist, da "es auch eine erhebliche Verzögerung beim Öffnen einer neuen Verbindung gibt"Sie können alle Ihre Befehle in einem separaten Skript auf Ihrem "Master" -Server ablegen.
Master Script
Rufen Sie es dann in Ihrem SSH-Skript folgendermaßen auf : SSH-Skript
ODER wenn sich alle Dateien auf dem ursprünglichen Computer befinden müssen, können Sie Folgendes tun:
script1
script2
SSH-Skript
quelle
Vor einiger Zeit hatte ich Gelegenheit, Control Sockets zu verwenden, wie es die anderen Antworten empfehlen (diese Antwort ist im Wesentlichen eine Kombination aus Control Sockets wie dieser Antwort und Skripten wie dieser Antwort ).
Der Anwendungsfall war ein Hack: Der
authorized_keys
des Zielbenutzers wurde regelmäßig durch eine geplante Aufgabe überschrieben, und ich wollte die Dinge schnell testen, ohne Bürokratie zu benötigen, um dieser Datei etwas hinzuzufügen. Also habe ich eine while-Schleife eingerichtet, die den Schlüssel nach Bedarf zu dieser Datei hinzufügt, meinen Test ausgeführt und die Schleife abgebrochen. Es würde jedoch ein kleines Fenster geben, in dem die geplante Aufgabe die Datei überschreiben würde und meine Schleife immer nochsleep
läuft. Wenn Sie also zu Beginn einen Control Socket einrichten, kann mein Skript später problemlos SSH ausführen:Wo
setup-ssh.sh
ist:Und
.ssh-config
:Und
run-test.sh
:Die Reihenfolge sieht folgendermaßen aus:
setup-ssh.sh
.setup-ssh.sh
Busy-Loops der Server, bis alle über einen Control Socket-Setup verfügen. In derhosts
Datei werden einfach die Server-Hostnamen pro Zeile aufgelistet.${CONFIG_DIR}/scripts/.ssh-config
ist-F
, wird sie von SSH-Verbindungen nicht verwendet, es sei denn, ich gebe diese Datei mit an . Auf diese Weise kann ich die Steuerbuchse nur dort verwenden, wo ich sie mit derF
Option benötige .xargs
die Arbeitslast auf die Server, indem neue Jobs gestartet werden, sobald die Ausführung beendet ist.quelle