X-Window-Desktop fernsteuern per Shell-Skript und VNC

Nicht jeder Linux-Nutzer ist ein Experte, der fehlerfrei Kolonnen von Unix-Befehlen eintippt. Ein freundlicher Experte kann übers Internet aber nützliche Tipps und schnelle Hilfe leisten.

In Pocket speichern vorlesen Druckansicht 3 Kommentare lesen
Lesezeit: 11 Min.
Von
  • Reiko Kaps
Inhaltsverzeichnis

Nicht jeder Linux-Nutzer ist ein Experte, der fehlerfrei Kolonnen von Unix-Befehlen samt Optionen eintippt und nebenbei die System-Nachrichten auf Merkwürdigkeiten überprüft. Ein freundlicher Experte kann übers Internet aber nützliche Tipps und schnelle Hilfe leisten, wenn es im Linux-System klemmt oder hakt. Der erfahrene Helfer stellt dem Linux-Neuling dazu ein Bash-Skript bereit, das diese Verbindung per Virtual Network Computing aufbaut und möglichst viele Probleme automatisch löst.

Außer unter Linux sollte das Helfer-Skript auch unter anderen Betriebssystemen laufen, die als grafische Oberfläche X besitzen, eine Bash-Shell mitbringen und für die der VNC-Server x11vnc bereitsteht. Getestet haben wir es jedoch nur auf einigen Linuxen wie Debian/Unstable, Ubuntu und Suse. Auf der Helfer-Seite benötigt man nur ein Betriebssystem, für das ein VNC-Viewer bereitsteht.

Startet ein klassischer VNC-Server wie TightVNC in einer laufenden X-Window-Sitzung, exportiert er nicht etwa den aktuellen Bildschirm des angemeldeten Benutzers. Er erzeugt stattdessen einen neuen, virtuellen Desktop, startet dort ein neue Instanz eines Window-Managers und zeigt ihn übers Netz an.

Herkömmliche VNC-Server zeigen aus einer laufenden X-Window-Sitzung nicht den aktuellen Desktop an, sondern erzeugen einen neuen.

Anders verhält sich die Funktion "Entfernter Desktop" unter den Desktop-Umgebungen Gnome oder KDE, die den aktuellen Bildschirminhalt ebenfalls über VNC ausliefern. Allerdings reicht diese Funktion nicht aus, um unkompliziert und ohne zusätzliche Eingriffe über NAT-Router und Firewalls hinweg einen Linux-Desktop zu steuern. Ähnlich wie bei der Remote-Unterstützung in Windows müsste der Hilfesuchende am eigenen Netzwerk-Router noch Port-Weiterleitungen und Filterregeln einrichten, was vielen jedoch nicht zuzumuten ist.

Die Gnome-Funktion "Entfernter Desktop" funktioniert recht gut im LAN, übers Internet benötigt sie jedoch wenigstens Port-Weiterleitungen am Router.

Will man einen laufenden X-Window-Bildschirm samt Tastatur und Mauszeiger übers Internet steuern, helfen der VNC-Server x11vnc und die im Artikel Windows-Fernsteuerung auf Doppelklick beschriebene Methode. Dabei baut nicht der Helfer die VNC-Sitzung auf, sondern der Hilfesuchende, indem er dem VNC-Server ausdrücklich eine Adresse für eine Client-Verbindung übergibt. Kraft seines Expertenwissens stattet der Helfer seinen eigenen Router mit einer Port-Weiterleitung aus und startet einen VNC-Viewer mit dem Parameter -listen im Lauschmodus, sodass der x11vnc-Server eine Verbindung aufbauen kann.

Der Rechner des Helfers benötigt entweder eine feste IP-Adresse oder einen DNS-Namen für die dynamische Adresse seiner DSL-Einwahl, wie man sie beispielsweise über DynDNS.org beziehen kann. Eine Client-Software auf aktuellen Routern meldet bei jeder DSL-Einwahl die neue IP-Adresse an den DynDNS-Dienst, sodass später der VNC-Server den VNC-Client beispielsweise unter der Adresse meinhelfer.dyndns.org erreicht.

Im zweiten Schritt muss der Helfer auf seinem Router eine Port-Weiterleitung einrichten, die die Verbindung an den Helfer-Rechner ins LAN durchreicht. VNC-Viewer hören gewöhnlich auf Port 5500. Sicherer ist jedoch, ihn zu verlegen – beispielsweise auf Nummern oberhalb von 50 000. Manche Router beherrschen beim Port-Forwarding auch das Umbiegen von Ports, beispielsweise vom externen Router-Port 55 123 auf den Port 5500 eines LAN-Rechners. Der Viewer arbeitet so mit seinen Vorgaben; aus dem Internet erreicht man ihn jedoch über einen abweichenden Port, was Angreifern das Leben etwas schwerer macht.

Der Helfer muss nun diese Daten ins Skript übertragen, das aus einer Reihe von Variablen, einer Anzahl von Funktionen und einem kurzem Hauptteil am Ende des Skripts besteht. Wichtig für das reibungslose Funktionieren sind die vier Variablen unterhalb des Kommentars # WICHTIGE Parameter, die der Helfer anpassen muss.

LISTENERURL="meinhelper.dyndns.org:55123" 
X11VNC_URL="http://x11vnc.mirror.beispiel/x11vnc"
X11VNC_MD5="a234dc2ec7ff6cf8cf146dd00f8579b9"
ACCEPT="popup"

Die Variable LISTENERURL enthält durch einen Doppelpunkt getrennt die Adresse samt Portnummer, unter der der VNC-Client des Helfers im Internet lauscht. In X11VNC_URL muss eine URL stehen, über die das Skript eine Binärversion von x11vnc finden kann. Der x11vnc-Entwickler Karl Runge stellt übersetzte x11vnc-Binaries für verschiedene Plattformen bereit. Besitzt man einen eigenen Webserver, sollte man das Programm jedoch dort ablegen und gegebenenfalls die MD5-Checksumme in der Variable X11VNC_MD5 anpassen. Den korrekten Wert liefert unter Linux das Kommando md5sum, wenn man ihm den Programmpfad als Parameter übergibt. Deklariert das Skript eine Variable namens ACCEPT, die den Wert "popup" enthält, fragt das Skript beim Hilfesuchenden nach, ob und in welcher Art er eine Verbindung wünscht.

Die Werte in den Skript-Variablen unterhalb von "Sonstige Einstellungen" steuern das Verhalten von x11vnc, benötigen aber keine Anpassung. Möchte man dem VNC-Server x11vnc für spezielle Fälle weitere Parameter mitgeben, erweitert man die Variable VNCPAR.

Sie enthält die Parameterliste für den x11vnc-Aufruf. Mit den im Skript eingetragenen Optionen speichert x11vnc seine Statusmeldungen ins Dateisystem, versucht 30 Sekunden lang eine Verbindung aufzubauen und beendet sich nach der ersten Verbindung automatisch. Der x11vnc-Parameter -noxdamage schaltet eine Erweiterung des VNC-Servers ab, die normalerweise die Bildübertragung verbessert, die aber anscheinend Probleme unter 3D-Desktop-Umgebungen wie compiz verursacht.

Anschließend verpackt der Helfer das Skript in eine E-Mail und schickt diese dem Linux-Neuling. Dieser speichert den Skript-Anhang, öffnet ein Terminalfenster, wechselt dort zum Speicherort des Skripts und startet es über die Befehlszeile bash ct-helfer.sh. Anschließend beginnt das Skript mit seiner Arbeit, zeigt per neuem Terminalfenster Statusinformationen an und baut die Verbindung zwischen Hilfesuchendem und Helfer auf.

Der VNC-Server x11vnc gehört nicht zur Standardausrüstung der meisten Linux-Distributionen, sodass der Hilfesuchende ihn nachinstallieren müsste. Diese Hürde räumt jedoch das Skript aus, das der Helfer seinem Klienten per Mail zusendet. Ist auf dem Linux kein x11vnc installiert, holt es sich das Programm aus dem Internet. In der Hauptsache baut das kleine Programm die Verbindung zwischen Server und Client auf, rudimentär informiert es den Hilfsbedürftigen jedoch auch über den Verbindungsaufbau und gibt ihm die Möglichkeit, die Verbindung zu beenden.

Das Skript für den Linux-Fernkurs setzt eine laufende Sitzung unter X Window, eine aktive Internetverbindung und einen E-Mail-Zugang voraus. Alle anderen für den Ablauf nötigen Dinge überprüft das Skript automatisch. Außerdem greift es auf ein paar externe Programme zurück: Einige gehören zum Grundsystem eines Linux-Rechners, andere wie die Kommandos wget, curl oder lynx könnten jedoch fehlen. Das Programm wget dürfte zwar auf den meisten Linux-Installationen vorhanden sein, doch für den Fall der Fälle sucht das Skript nach den beiden Alternativen curl und lynx. Der Download über Bash-Funktionen scheidet aus, denn unter Ubuntu und Debian sind diese Shell-Erweiterungen nicht eingebaut.

Das vollständige Skript steht zum Download bereit, auszugsweise finden Sie eine Funktion im Listing unten: Bevor das Skript seine eigentliche Aufgabe erfüllen kann, muss es einige Bedingungen überprüfen: Es soll beispielsweise niemals als Root-Benutzer starten und x11vnc benötigt zwingend eine schon laufende X-Sitzung. Anschließend sucht es mittels des Kommandos which zuerst nach einer installierten Version von x11vnc. Findet das Skript das Kommando, startet es die installierte x11vnc-Version.

Bleibt die Suche erfolglos, versucht das Programm mittels der Download-Hilfen wget, curl oder des Konsolen-Browsers lynx, eine fertige übersetzte x11vnc-Version aus dem Internet zu laden. Im Beispiel legt es sie im Verzeichnis /tmp/ct-helfer ab. Anschließend macht der Befehl chmod +x aus der Datei ein ausführbares Programm.

Findet der Server unter der angegebenen Adresse (LISTENERURL) einen VNC-Client in Lauschstellung, startet er die Sitzung.

Der VNC-Server schreibt nun seine Ausgaben in eine Datei unterhalb von /tmp/ct-helfer. Ein parallel gestartetes X-Terminal zeigt diese Daten an, bricht aber bei Bedarf auch die Verbindung ab. Hat der Hilfesuchende genug Ratschläge bekommen und möchte allein und unbeobachtet weiterarbeiten, beendet die Tastenkombination Strg-C den Server und damit die Verbindung.

Beendet umgekehrt der Helfer seine VNC-Sitzung, beendet sich anschließend auch der VNC-Server auf der Seite des Hilfesuchenden. Eine while-Schleife im Skript überprüft alle fünf Sekunden, ob die Nummern beider Prozesse noch in der Prozessliste vorhanden sind. Ist eines der beiden Programme nicht mehr in der Liste, beendet das Skript das jeweils andere Programm und anschließend sich selbst.

Ausschnitt aus dem Skript

function vnc_connect() 
{
echo "Starte VNC-Server ..."
${X11VNC_PATH} ${VNCPAR} & x11vncpid=$!
$XTERM -title "ct-Helferlein: Mit Strg-C beenden" \
-e tail -f ${X11VNC_DIR}/$LOGFILE & xdialogpid=$!
# solang wie beide Programm laufen ...
# sonst den Rest beenden
while ps $x11vncpid > /dev/null \&& ps $xdialogpid > /dev/null
do
sleep 5
done
if ps $x11vncpid > /dev/null ; then
kill $x11vncpid
else
kill $xdialogpid
fi
}

Die while-Schleife überprüft, ob x11vnc und das X-Terminal laufen. Fehlt eines der beiden in der Prozesstabelle, beendet das Skript das jeweils andere Programm und anschließend sich selbst.

Wir haben das Skript auf Rechnern ausprobiert, die mit den Linux-Distributionen Grml (Debian Sid), Ubuntu 7.10, Suse 10.1 und Mandriva laufen. Dabei traten auf Grml, Ubuntu und Suse keine Probleme beim Verbindungsaufbau auf. Unter einem KDE-4-Desktop auf Mandriva-Linux startete das Skript zwar, der Client zeigte den entfernten Desktop auch kurz an, doch anschließend beendete sich der VNC-Server sofort. Wir konnten allerdings den Grund dafür nicht ausfindig machen, ein KDE 3 auf demselben System arbeitete wie erwartet.

Linux-Installationen auf denen ein 3D-Desktop arbeitet, machten anfangs ebenfalls Probleme. Fenster konnte man nur sehr zäh über den Desktop schieben und auch die Maus- und Tastatureingabe hakelte etwas. Abhilfe schaffte der zusätzliche x11vnc-Parameter -noxdamage. Der VNC-Server x11vnc schaltet anscheinend unter X die Tastenwiederholrate aus, sodass das Skript sie nach der Sitzung oder bei Programmende mit xset r on wieder anschaltet.

Weitere Probleme können auf Systemen auftauchen, die das Verzeichnis /tmp mit dem Mount-Parameter noexec einbinden und damit die Ausführung von Programmen unterbinden. Verlegt man den Basispfad aus X11VNC_DIR in ein für den Benutzer beschreibbares und nicht mit noexec eingebundenes Dateisystem wie beispielsweise $HOME, sollte sich die Klippe umschiffen lassen. Schwerwiegender können jedoch die Linux-Sicherheitsmechanismen AppArmor oder SELinux sein: Sie unterbinden das Ausführen unbekannter Programme, sodass das Skript und x11vnc vor die Wand laufen. Abhilfe ist hier nur mit Administratorrechten möglich. (rek/c't) ()