Fernwartung mit SSH

Mit SSH Skripte und interaktive Befehle auf entfernten Rechnern ausführen

Anstatt mit einem SSH-Client eine Konsole auf einem entfernten Rechner zu öffnen um dort ein Skript oder ein Befehl auszuführen, lässt sich die Ein- und Ausgabe auch auf den lokalen Rechner umleiten wenn man der SSH-Verbindung ein Pseudo-Terminal zuweist.

Der übliche Weg, Befehle oder ganze Programme auf einem entfernten Rechner auszuführen, besteht darin, per ssh eine Konsole auf dem entfernten Rechner zu öffnen, darin die erforderlichen Befehle ggfs. mit Interaktion aufzurufen und die Konsole wieder zu verlassen.

Ein Beispiel dafür ist eine regelmäßige Paketaktualisierung auf einem Debian-basierenden entfernten Server, der in dem unten betrachteten Beispiel Curcuma heißen soll. Der lokale Arbeitsplatzrechner soll Caboto heißen.

Üblicherweise würde man mit ssh die Verbindung aufbauen, dann mit sudo apt-get update die Paketquellen aktualisieren, bevor man mit sudo apt-get dist-upgrade die eigentliche Paketaktualisierung durchführt (oder auch nicht) und dann den Server mit exit verlässt:

uwe@Caboto:~$ ssh admin@Curcuma
Linux Curcuma 4.9.0-13-amd64 #1 SMP Debian 4.9.228-1 (2020-07-05) x86_64
Last login: Sun Oct 18 16:14:13 2020 from 123.123.123.123
admin@Curcuma:~$ sudo apt-get update
[sudo] Passwort für admin: 
Ign:1 https://deb.debian.org/debian stretch InRelease
OK:2 https://packages.sury.org/php stretch InRelease
OK:3 https://deb.debian.org/debian-security stretch/updates InRelease
OK:4 https://deb.debian.org/debian stretch-updates InRelease
OK:5 https://packages.icinga.com/debian icinga-stretch InRelease
OK:6 https://deb.debian.org/debian stretch-backports InRelease
OK:7 https://deb.debian.org/debian stretch Release
OK:8 https://repo.spicyfamily.de/apt/debian ./ InRelease
Paketlisten werden gelesen... Fertig
admin@Curcuma:~$ sudo apt-get dist-upgrade 
...
Möchten Sie fortfahren? [J/n]
...
admin@Curcuma:~$ exit
Abgemeldet
Connection to Curcuma closed.
uwe@Caboto:~$

Zunächst wäre es eine Vereinfachung, die beiden apt-get Befehle in einer Befehlszeile auszuführen:

uwe@Caboto:~$ ssh admin@Curcuma
Linux Curcuma 4.9.0-13-amd64 #1 SMP Debian 4.9.228-1 (2020-07-05) x86_64
Last login: Sun Oct 18 16:14:13 2020 from 123.123.123.123
admin@Curcuma:~$ sudo apt-get update && sudo apt-get dist-upgrade
[sudo] Passwort für admin: 
...
Möchten Sie fortfahren? [J/n]
...
admin@Curcuma:~$ exit
Abgemeldet
Connection to Curcuma closed.
uwe@Caboto:~$

Somit würde der Aufruf dieser einen Befehlszeile genügen, um die Pakete auf Curcuma zu aktualisieren.

Da man an den Verbindungsaufruf mit ssh einen Befehl anhängen kann, der dann auf dem entfernten Rechner ausgeführt wird, könnte man sich die Eingabe von drei einzelnen Befehlen sparen. Zu beachten ist dabei, dass die verketteten apt-get Befehle in Anführungszeichen eingegeben werden müssen, damit sie für ssh als ein Befehl erscheinen:

uwe@Caboto:~$ ssh admin@Curcuma "sudo apt-get update && sudo apt-get dist-upgrade"
sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben
uwe@Caboto:~$

Das geht aber offenbar nicht.

Wie man bereits oben gesehen hat, verlangt das sudo Programm auf Curcuma interaktiv nach der Eingabe eines Passwortes, findet dafür aber kein Terminal, da es ja nicht wissen kann, dass es von einem anderen Rechner als Parameter des ssh Befehls aufgerufen wurde.

Man kann jedoch ssh beim Aufruf zwingen, ein Pseudo-Terminal zur Verfügung zu stellen, das das entfernte Programm nutzen kann. Dies geschieht mit dem Parameter -t:

uwe@Caboto:~$ ssh -t admin@Curcuma "sudo apt-get update && sudo apt-get dist-upgrade"
[sudo] Passwort für admin: 
...
Möchten Sie fortfahren? [J/n]
...
uwe@Caboto:~$

Jetzt ist es möglich, die Paketaktualisierung auf dem Server Curcuma mit einem einzigen Befehl vom Arbeitsplatzrechner Caboto aus durchzuführen.

Der Parameter -t wird auch benötigt, um auf dem entfernten Rechner anstatt eines Befehls z.B. einen Editor wie vi, nano oder joe auf der entfernten Konsole zu starten.

Top