
Um diese Erklärung zu geben,Maschineist mein Laptop, und ich verwende ihn, um mich mit einem Remote-Server zu verbinden - den ich alsServername.
Der Ablauf lässt sich wie folgt beschreiben:
- Ich verbinde mich mit dem ServerServernamemit
ssh
vonMaschine - Ich füge dann das Passwort ein fürServername
- Ich kompiliere etwas aufServername
- Ich melde mich ab vonServername(mithilfe von
exit
) - Ich starte dann neuServernameausMaschine
- ICH
ping
Servernameund dann warte ich, bis ich eine Antwort bekomme (ping
die Ausgabe wird auf der Konsole angezeigt) - Ich
ssh
inServernamewieder - Ich führe einige Kontrollen durch
- Schließlich
exit
möchte ichServernameum zurück zu gehen zuMaschine
Um das obige Rezept zu erreichen,manuellFühren Sie die folgenden Befehle ausMaschine:
<machine>$ ssh server_name
insert password for server_name:
<server_name>$ cd /some/path/
<server_name>$ make clean > /dev/null
<server_name>$ make > /dev/null
<server_name>$ exit
<machine>$ ./my_reboot_script server_name
<machine>$ ping server_name
PING 10.23.22.7 with 56(84) bytes of data.
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
^C
<machine>$ ssh server_name
insert password for server_name:
<server_name>$ ./run_some_checks
<server_name>$ exit
<machine>$ echo "Done!"
Ein paar Anmerkungen zu den oben genannten Punkten sind angebracht:
- my_reboot_script
ist nur ein Programm, das mir einen Kaltstart ermöglichtServernamevom Comport meines eigenen Sitzes aus.
- Nach einem KaltstartServernamemuss ich warten, bis es wieder funktioniert, damit ich mich mit wieder damit verbinden kann ssh
. Dazu verwende ich ping
; es dient lediglich als Hinweis darauf, wannServernameist bereit, wieder Verbindungen anzunehmen; Erst wenn ich sehe, dass die ping
Ausgabe endlich auf der Konsole erscheint, unterbreche ich sie mit Strg+C und gehe dann ssh
inServername.
Das oben genannte manuell durchzuführen ist mühsam und zeitaufwändig. Deshalb möchte ich den obigen Prozess automatisieren, aber es gibt drei Schwierigkeiten:
- Bei Verbindung mitServername, das Ausführen des
exit
Befehls aus der Shell meldet mich ordnungsgemäß ab und bringt mich zurück zuMaschine. Die Ausführungexit
aus einer Skriptdatei heraus.sh
beendet jedoch das Skript ... - Wie kann ich das Passwort automatisieren, umServernamePhase? Ich möchte das Passwort nicht manuell eingeben, sondern es lieber dem Skript überlassen. Mit anderen Worten: Ich möchte das Passwort irgendwie im Skript fest codieren, damit es mich nicht damit belästigt.
- Die Phase „Warten, bis der Server für SSH-Verbindungen bereit ist“: Wie kann ich das automatisieren? Das heißt, anstatt einfach zu
ping
warten, bis ich eine Antwort bekomme, und dann mit Strg+C zu unterbrechen, möchte ich, dass das Skriptping
erkennt, dass eine Antwort vonServername, dann verbinden Sie sich mitssh
. Obwohl die Verwendungping
hier vielleicht keine so gute Idee ist, da die Antwort aufping
nicht garantiert, dassServernameist bereit, aufssh
Verbindungen zu warten (aus meiner Erfahrung mit dem obigen Prozess dauert es noch ein paar Sekunden, nachdem die erste Antwort auf die Verbindungping
eingeht). Daher wäre es vielleicht besser, wenn das Skriptssh
in einer Schleife weiter versucht, den Zugriff zu gewähren (eine Art Wartemechanismus oder sogar eine Schleife, die schläft und alle paar Sekunden aufwacht, um zu versuchen, eine Verbindung herzustellen).
Antwort1
Wenn Sie die öffentlichen Schlüsseldaten von Ihrem Computer in die .ssh/authorized_key
Dateien des Servers übertragen können, können Sie die Kompilierung mit einem einzigen ssh
Aufruf pro Server ausführen, ohne jemals ein Kennwort eingeben zu müssen:
ssh someone@$SERVER 'cd /some/path/; make clean > /dev/null; make > /dev/null;'
Sie könnten das in eine Schleife in einem Shell-Skript einfügen und den Wert der Shell-Variable SERVER
bei jedem Durchlauf ändern. Wenn es Ihnen nichts ausmacht, bei jedem ssh
Aufruf Ihr Passwort einzugeben, benötigen Sie nicht einmal die öffentlichen Schlüsseldaten auf den Servern.