Mit Mausklicks ein Administrationsskript auf dem Linux-Server zu starten klingt komplizierter, als es ist. Wer so für seine Desktop-Anwender ansprechende, interaktive Dialoge stricken will, braucht nur die SSH, eines der kleinen Hilfsprogramme und ein wenig Bash-Know-how.
Die verstopfte Druckerwarteschlange löschen oder nach Abschluss jedes wichtigen Projekts sofort ein vollständiges Backup ins SAN schreiben? All das sind Aufgaben, die den Admin von wichtigerer Arbeit abhalten. Schön, wenn er es seinen Anwendern erlauben kann, derart simple, sich wiederholende administrative Arbeiten selbst zu erledigen. Damit das auch der unerfahrenste User sicher bewerkstelligen kann, hinterlegt ihm der Admin im Idealfall ein Icon auf dem Desktop. Das startet per Mausklick ein selbst gestricktes Programm mit einem einfachen GUI und triggert via SSH auf dem Linux-Server Aktionen.
Hat der Admin in seinem Nähkästchen die SSH, Sudo und eines der im Folgenden beschriebenen Dialogsysteme Zenity, Yad, Kdialog oder Rex, dann muss sich der Clientanwender nicht mit Linux-Konzepten oder Befehlszeilenkonventionen auseinandersetzen. Für Windows-Clients gibt’s Putty oder Win SCP – oder die Powershell.
Schlüsselmeister mit Hilfsagenten
Damit das Szenario funktioniert, braucht der instruierte Anwender auf seinem Client einen SSH-Key, der als Zugangsberechtigung für den Linux-Server dient. Zwar ginge das auch mit der herkömmlichen Login-Passwort-Kombination, doch die unbeliebte Tipparbeit lässt sich sparen. Ein lokales Schlüsselpaar erzeugt »ssh-keygen« , das sofort nach einem Speicherort für die Schlüssel sowie einer Key-Passphrase fragt. Sicherheitsbewusste Admins vergeben hier ein Passwort für den Zugriff auf den Schlüssel, denken aber auch an den Benutzerkomfort (siehe Kasten “Sicherer Agent”).
Sicherer Agent
Die von »ssh-keygen« verlangte Passphrase sichert die Schlüsseldateien ab. Wenn »ssh« die Verbindung aufbaut, fragt sie die Passphrase ab, öffnet im Erfolgsfall die Schlüsseldateien und nutzt diese zur Anmeldung.
Wer auf die Passphrase verzichtet, riskiert, dass sich jeder, der in den Besitz der Schlüsseldatei gelangt, ohne Passwort am entfernten Rechner anmelden kann. Der Admin muss – je nach Policy im Unternehmen – selbst entscheiden, ob der für den Anwender bequemere, aber unsichere Weg ohne Passwort ausreicht. Wer die Eingabe einer Passphrase verlangt, muss dies auch in den Skripten berücksichtigen.
Glücklicherweise gibt es den »ssh-agent« . Er läuft als Daemon im Hintergrund auf Linux-Systemen und merkt sich ein oder mehrere Passwörter. Meldet sich der Benutzer per SSH irgendwo an, dann übernimmt der »ssh-agent« das Übermitteln der Passphrase. So einen Agenten zu benutzen ist kinderleicht: Erst einen Schlüssel über »ssh-keygen« erzeugen, eine Passphrase angeben und danach »ssh-agent -t 60m« starten. Der Parameter »-t 60m« macht den Agenten bewusst senil: Damit vergisst er jede ihm beigebrachte Passphrase nach einer Stunde. »ssh-add« übergibt ihm gezielt eine Passphrase, die Anmeldung am SSH-Server klappt innerhalb der Zeitspanne sicher und trotzdem ohne Passwort.
Jetzt liegen unter »~/.ssh« ein privater und ein öffentlicher Schlüssel, der zweite gelangt mit »ssh-copy-id Benutzername@Server« auf den SSH-Server. Anschließend wandert der öffentliche Schlüssel auf den entfernten Computer »example.com« und landet dort in der Datei »~/.ssh/authorized_keys« . Jetzt ist es Zeit für einen Test mit »ssh Benutzername@Server« , der ohne Passwortabfrage klappen sollte (Abbildung 1).

Abbildung 1: SSH-Login mit Key: Nach nur zwei Befehlen ist für das Einloggen auf dem SSH-Server (hier mit der IP-Adresse 192.168.2.12) kein Passwort mehr nötig.
Den auf dem entfernten Rechner auszuführenden Befehl hängt der Admin einfach an das SSH-Kommando an:
ssh tim@example.com "uptime -V"
Die Anführungszeichen helfen der Bash, »-V« oder auch »–version« nicht als Parameter für die SSH selbst misszuverstehen. Der Befehl liefert die Versionsnummer des Programms »uptime« auf dem entfernten Rechner (Abbildung 2).Nach dem gleichen Prinzip lassen sich natürlich auch Skripte auf dem Server zünden – etwa eines, das nach dem Projektabschluss ein außerplanmäßiges Vollbackup anstößt.

Abbildung 2: Unter Open Suse 12.2, das hier auf dem entfernten Rechner läuft, zeigt »uptime« die Versionsnummer mit dem Parameter »–version«.
Remote-Admin für einzelne Jobs
Wer den Benutzer auf dem entfernten Computer in die Liste der privilegierten User in »/etc/sudoers« aufnimmt, erlaubt ihm auch Aufgaben des Admins zu erledigen, beispielsweise ein Backup mit Rootrechten durchzuführen:
ssh tim@example.com "sudo /sbin/backup.sh"
Die Beispiele bisher konzentrierten sich auf die Shell, aber es geht auch noch deutlich komfortabler. Bei mehreren Aufgaben müsste sich der Anwender die Namen der für ihn bereitgestellten Skripte und Programme merken – das ist in vielen Fällen illusorisch. Netter ist es, ihm ein Fenster mit einem Auswahldialog zu präsentieren, aus dem er die aktuell gewünschte Aufgabe aussucht. Für genau solche Zwecke gibt es die Programme Zenity, Yad und Kdialog. Sie öffnen jeweils einen Listendialog, den der Admin in gewissen Grenzen selbst gestalten kann.
Fenster auf!
Die angeklickte Schaltfläche oder das ausgewählte Element liefern die Werkzeuge dann an die Shell zurück, der Admin muss den Wert an der Bash beziehungsweise in einem Skript nur noch abfangen und auswerten. Während Zenity das Toolkit GTK+ nutzt, richtet sich Kdialog an KDE-Nutzer. Yad wiederum ist ein Fork von Zenity, der ein paar Möglichkeiten mehr bietet – beispielsweise nimmt er auf die speziellen Gegebenheiten von Unity Rücksicht [1]. Die drei sind normalerweise nicht in Standardinstallationen enthalten, liegen aber in den Repositories der meisten Distributionen.
Yad hingegen ist noch nicht überall verfügbar, für Ubuntu gibt es ein inoffizielles PPA-Repository, das
sudo add-apt-repository ppa:webupd8team/y-ppa-manager sudo apt-get update sudo apt-get install yad
einbindet und anzapft. Die Installation von Yad aus den Quelltexten setzt das Libtool-Paket sowie die Entwicklungspakete für GTK+ 2 voraus. Anschließend genügt der übliche Dreisatz: »./configure; make; sudo make install« .
Um die einfache Abfrage aus Abbildung 3 zu erstellen, genügt bei Zenity und Yad der Aufruf:
zenity --question --text="Skript ausführen?" --title="Frage"
Yad nutzt die gleiche Syntax wie Zenity, auch in den folgenden Beispielen genügt es daher, »zenity« gegen »yad« auszutauschen. Bei Kdialog sieht die Abfrage nicht viel anders aus (Abbildung 4):
kdialog --yesno "Skript ausführen?"--title "Frage"
Der Rückgabewert ist bei allen drei Werkzeugen »« , wenn der Benutzer »Ja« gedrückt hat, andernfalls »1« :
if [ "$?" = 0 ]; then echo "Ja gedrückt" fi
Um das auszuführende Skript oder Programm auszuwählen, muss eine Liste her. Auch die ist mit Zenity und Yad schnell definiert (Listing 1). Der Übersichtlichkeit halber empfiehlt es sich, die bisweilen recht langen Befehle mit Backslashes in einzelne Zeilen zu zerlegen. Das erzeugt die Liste aus Abbildung 5, in der Benutzer nun einen Eintrag auswählen können.
Listing 1
Zenity mit Auswahldialog
01 #!/bin/bash 02 03 BEFEHL=$(zenity --list \ 04 --title="Programm oder Skript wählen" \ 05 --column="Skript" --column="Beschreibung" \ 06 uptime "Uptime ermitteln" \ 07 ls "Directory auflisten" ) 08 09 ssh tim@example.com "$BEFEHL"
Nach einem Klick auf »OK« liefert Zenity (beziehungsweise Yad) den Text aus der ersten Spalte auf der Standardausgabe zurück. Der Admin sorgt dafür, dass seine Skripte diesen Text abfangen und an die »ssh« weiterreichen. Kdialog funktioniert nach dem gleichen Prinzip, das entsprechende Skript zeigt Listing 2, das Fenster Abbildung 6.
Listing 2
Kdialog-Dialog
01 #!/bin/bash 02 03 BEFEHL=$(kdialog --menu "Programm oder Skript wählen" uptime "Uptime ermitteln" ls "Verzeichnis auflisten") 04 05 ssh tim@example.com "$BEFEHL"
Wahlautomat
Einige Skripte und Programme erwarten Parameter an der Kommandozeile. Ein Skript für das Backup könnte etwa den Startzeitpunkt der Sicherung entgegennehmen. Dazu lässt man Zenity & Co. ein Eingabefeld anzeigen. Wie das funktioniert, zeigt Listing 3 für Zenity und Yad, Listing 4 für Kdialog.
Listing 3
Parameterabfrage mit Zenity
01 #!/bin/bash 02 03 BEFEHL=$(zenity --list \ 04 --title="Skript wählen" \ 05 --column="Skript" --column="Beschreibung" \ 06 backup.sh "Backup erstellen" \ 07 uptime "Uptime ermitteln" ) 08 09 PARAM="" 10 if [ "$BEFEHL" = backup.sh ]; then 11 PARAM=$(zenity --entry \ 12 --title="Datum" \ 13 --text="Geben Sie das Datum ein:" \ 14 --entry-text "01.02.2012" ) 15 fi 16 17 ssh tim@example.com "$BEFEHL $PARAM"
Listing 4
Parameterabfrage mit Kdialog
01 #!/bin/bash 02 03 BEFEHL=$(kdialog --menu "Programm oder Skript wählen" full_backup.sh "Backup erstellen" uptime "Uptime ermitteln") 04 05 PARAM="" 06 if [ "$BEFEHL" = full_backup.sh ]; then 07 PARAM=$(kdialog --title "Datum" --inputbox "Geben Sie das Datum ein" "01.02.2012") 08 fi 09 10 ssh tim@example.com "$BEFEHL $PARAM"
Im Fall eines Datums lässt sich anstelle des Eingabefelds auch ein spezielles Datumsfeld verwenden:
PARAM=$(zenity --calendar \ --title="Datum" \ --text="Klicken Sie auf das Datum" \ --day=01 --month=02 --year=2012)
Für Kdialog etwas einfacher (Abbildung 7)mit »PARAM =$(kdialog –calendar “Geben Sie das Datum ein” –title “Datum”)« . Kdialog liefert allerdings ein Datum im Format “Mi. Aug 15 2012”, was der Admin wiederum beim Schreiben der Skripte auf dem Server (zum Beispiel in »backup.sh« ) berücksichtigen muss.
Die Ausgaben der SSH landen in der Standardausgabe. Sie lässt sich abfangen und ebenfalls in ein Textfenster packen:
AUSGABE=$(ssh 192.168.2.12 "$BEFEHL $PARAM") zenity --info --text="$AUSGABE"
Oder für Kdialog mit »kdialog –msgbox “$AUSGABE”« .
Achtzeiler für den Desktop
Den fertigen Achtzeiler muss der Admin jetzt nur noch als Skript speichern und für ihn auf dem Desktop ein Symbol anlegen. Dazu genügt es in der Regel, sein Symbol aus dem Dateimanager auf den Desktop zu ziehen und die Einträge im »Eigenschaften« -Dialog anzupassen.
Die vorgestellten Skripte sind absichtlich einfach gehalten und schreien geradezu nach entsprechenden Erweiterungen – wie etwa einer Fehlerabfrage. Für komplexere Aufgaben bieten Zenity, Yad und Kdialog noch viele weitere Eingabefelder und Auswahlmöglichkeiten. Ihre Funktionalitäten ähneln sich ziemlich, einen Überblick über die vorhandenen Fenstertypen gibt Tabelle 1.
Tabelle 1
Funktionen von Zenity, Yad und Kdialog
|
Programm |
Zenity |
Yad |
Kdialog |
|---|---|---|---|
|
Auswahl eines Piktogramms |
nein |
ja |
ja |
|
Bedaure (Eingabe falsch) |
nein (Nachbau möglich) |
nein (Nachbau möglich) |
ja |
|
Dropdown-Menü |
nein |
nein |
ja |
|
Datei-Auswahl |
ja |
ja |
ja |
|
Drag&Drop-Box |
nein |
ja |
ja |
|
Druckdialog |
nein |
ja |
nein |
|
Farbauswahl |
ja |
ja |
ja |
|
Fehlermeldung |
ja |
ja |
ja |
|
Fortschrittsanzeige |
ja |
ja |
ja |
|
Ja/Nein-Frage |
ja |
ja |
ja |
|
(Frei definierbares) Formular |
ja |
ja |
nein |
|
Information (Messagebox) |
ja |
ja |
ja |
|
Kalender |
ja |
ja |
ja |
|
Liste |
ja |
ja |
ja |
|
Nicht noch einmal fragen/anzeigen |
nein (Nachbau möglich) |
nein (Nachbau möglich) |
ja |
|
Passwort |
ja |
ja |
ja |
|
Schieberegler |
ja |
ja |
ja |
|
Schriftartauswahl |
nein |
ja |
ja |
|
Textdatei anzeigen |
ja |
ja |
ja |
|
Texteingabefeld |
ja |
ja |
ja |
|
URL |
nein |
nein |
ja |
|
Warnmeldung |
ja |
ja |
ja |
Welches der drei Werkzeuge man nutzt, bleibt somit Geschmackssache. Bis auf Zenity ist die offizielle Dokumentation allerdings äußerst dürftig, besser ist es, immer zunächst die Direkthilfe des Kommandos aufzurufen, im Fall von Kdialog also etwa »kdialog –help« .
Linux leichter
Windows-Clients lassen sich auch über Bash-Skripte und SSH-Tools wie Putty oder Win SCP dazu bringen, Admin-Aufgaben eines Linux-Servers zu unterstützen (siehe Kasten “Fensterln in der Ferne”). Aber eine schicke Benutzeroberfläche, wie sie mit Zenity & Co. auf Linux-Clients problemlos möglich ist, gibt es damit noch lange nicht. Dafür muss der Linux-Admin unter Windows schon etwas größere Geschütze auffahren, etwa die Powershell (http://9, http://10). Und wem die Funktionen der drei Linux-Tools nicht reichen, der sollte sich den Wartungsspezialisten (R)?ex (http://11, http://12) anschauen (siehe Kasten “Rex – die Königsklasse”), der eine zentrale Wartung aller Maschinen im Netz von einem Server aus verspricht, allerdings ein wenig mehr Einarbeitung verlangt.
Fensterln in der Ferne
Wer es einem Windows-Client erlauben will, via SSH auf ein Linux-System zugreifen, greift zu Win SCP und Putty. Letztgenanntes ist eigentlich eine Sammlung aus mehreren einzelnen Programmen. Um ein Kommando auf dem entfernten Linux-Rechner auszuführen, bedarf es »putty.exe« [4].
Nach dem Start trägt der Admin unter »Host Name (or IP address)« den Linux-Rechner ein (Abbildung 8) und markiert direkt darunter »SSH« und das Optionsfeld »Never« . Im linken Bereich des Fensters wechselt er zu »SSH« , sollte aber hier nicht den Zweig (über das Pluszeichen) aufklappen, sondern unter »Remote Command« den Befehl oder das Skript eintragen, das der entfernte Linux-Rechner ausführen soll – wie etwa »uptime -V« .

Abbildung 8: In Putty klickt sich der Benutzer die notwendigen Einstellungen zusammen und speichert sie dann unter einem Namen ab.
Klick-Orgien
Im linken Baum markiert er jetzt »Data« unterhalb von »Connection« . Hier trägt er unter »Auto-login username« den Benutzernamen ein, mit dem er sich auf dem Linux-Rechner anmelden will. Wer das überspringt, muss ihn bei jeder Anmeldung eintippen. Anschließend geht es wieder im Konfigurationsbaum auf der linken Seite zum obersten Eintrag »Session« . Unter »Saved Session« landet hier ein Name für die Konfiguration, »Save« speichert ihn. Per »Open« lassen sich die Einstellungen überprüfen.
Jetzt verlangt Putty in einem neuen Fenster das Passwort für die Verbindung, anschließend sollte die Uptime erscheinen. Auf die gleiche Weise fügt man für alle weiteren häufig benötigten Aufgaben weitere Konfigurationen hinzu. Später muss der User nur noch Putty starten, unter »Session« in der Liste »Saved Sessions« die Aufgabe markieren, auf »Load« klicken und die Sitzung per »Open« starten. Wem das immer noch zu viel Klickarbeit ist, kann Putty auch auf der Kommandozeile respektive der Eingabeaufforderung aufrufen:
putty -load “Uptime aufrufen”
Dieser Befehl lädt die Einstellungen der Konfiguration »Uptime aufrufen« und startet automatisch die entsprechende Sitzung. Auch eine Verknüpfung auf dem Desktop ist machbar: rechte Maustaste, »Neu« , »Verknüpfung« , »Durchsuchen« , »putty.exe« wählen, an den gezeigten Befehl noch »-load uptime« hängen, »Weiter« , einen Namen vergeben wie »Uptime anzeigen« , »Fertig stellen« – fertig.
Die Eingabe des Passworts kann sich sparen, wer wie unter Linux entsprechende Schlüssel generiert. Dazu benötigt er die Windows-Werkzeuge Puttygen und Pageant, die zu beschreiben einen eigenen Artikel füllen würden. Ausführliche Anleitungen sind unter [5] und [6] zu finden.
Win-SCP-Skripte
Win SCP ist ein SSH-Client mit einer grafischen Benutzeroberfläche, die an den Windows-Explorer erinnert [7]. Wie sein Name dezent andeutet, besteht seine eigentliche Aufgabe darin, per SCP Dateien zu kopieren. Er besitzt aber auch eine eigene Kommandozeile. Um mit ihr die Uptime auf dem Linux-Rechner abzufragen, genügt folgendes Kommando in der Eingabeaufforderung:
C:\Program Files\winscp tim@192.168.2.12 /console /command "call uptime"
Anstelle von »uptime« kann jedes beliebige Skript oder Programm auf dem Linux-Rechner stehen. Der Befehl startet Win SCP, das seine eigene Konsole aufruft. Jetzt muss der Anwender zweimal nacheinander das Passwort eintippen, dann führt Win SCP den nach dem Parameter »call« genannten Befehl aus, auch per Desktop-Icon. Eine etwas unübersichtliche Dokumentation zu Win SCP und seinen Scripting-Fähigkeiten findet sich unter [8].
Rex – die Königsklasse
Bei komplexeren Wartungsaufgaben stößt das Bash-Skript entweder an seine Grenzen oder die Skripte werden recht unübersichtlich. In solchen Fällen sollte man auf spezielle Wartungsprogramme ausweichen. Ein beliebtes und leistungsfähiges hört auf den Namen (R)?ex [11].
Es funktioniert nach einem ähnlichen Prinzip wie die Beispiele in diesem Artikel. Im Gegensatz zu diesen lässt sich (R)?ex allerdings mit Perl-Skripten füttern. Darüber hinaus liegen für ein paar Standardaufgaben bereits kurze Spezialbefehle bei. Die wiederum sind unabhängig von der Distribution. Den Apache Webserver startet beispielsweise:
desc "Apache starten";
task "apachestart", sub {
service "apache2" => "start";
}
So viel Komfort geht allerdings auch mit einer erhöhten Einarbeitungszeit einher. Die lohnt sich aber für alle Administratoren, die viele Rechner unter ihrer Kontrolle halten müssen.
Infos
- Yad: http://code.google.com/p/yad/
- Zenity-Handbuch: http://library.gnome.org/users/zenity/stable/index.html.de
- Kdialog-Tutorial: http://techbase.kde.org/Development/Tutorials/Shell_Scripting_with_KDE_Dialogs
- Putty: http://www.chiark.greenend.org.uk/~sgtatham/putty/
- Schlüssel generieren mit Puttygen: http://the.earth.li/~sgtatham/putty/0.62/htmldoc/Chapter8.html#pubkey
- Pageant: http://the.earth.li/~sgtatham/putty/0.62/htmldoc/Chapter9.html#pageant
- Win SCP: http://winscp.net
- Scripting mit Win SCP: http://winscp.net/eng/docs/scripting
- Skripte mit der Windows Powershell: http://technet.microsoft.com/en-us/scriptcenter/powershell.aspxY
- Holger Schwichtenberg, “Muschelzucht im Ausland”: Linux-Magazin 12/06, S. 92
- (R)?ex: http://rexify.org
- Tim Schürmann, “König der Rechner”: ADMIN-Magazin 05/12, S. 68







