Seite wählen

Protokoll-Handler in Firefox oder wie komm ich schnell zu meinen Problemen

von | Jul 6, 2012 | Linux, Windows, Icinga, Nagios

Eine der schnellsten und komfortabelsten Möglichkeiten auf ein problematisches System zuzugreifen ist für mich auf einen Link in der Überwachung zu klicken. Somit ist nur die Frage wie bekomme ich die Möglichkeit auf eine URL zu klicken und es öffnet sich meine SSH-Verbindung, mein VNC-Fenster oder die Remotedesktop-Sitzung?
Die Lösung hierfür heißt auf der einen Seite action_url (oder notes_url) in Nagios oder Icinga, auf der anderen Seite muss ich meinen Browser noch dazu bringen mit entsprechenden URLs umzugehen. Chrome reicht diese einfach an das System weiter, was gut funktioniert wie mir gesagt wurde. Der Internet Explorer und Firefox brauchen dagegen etwas Hilfe. Natürlich gibt es für beide Lösungen wie entsprechende Plugins, hier wäre für den IE der Putty-Fork Kitty oder für den Firefox das javascript-basierende Addon Firessh zu nennen.
Nun ja, ich arbeite am liebsten mit Firefox, einfach aus der Historie heraus, und ich nutze am liebsten meine gewohnten Werkzeuge, also ist alles vorherige schön und gut, aber nicht was ich will. Außerdem handelt es sich um keine allumfassende Möglichkeit, wenn ich noch weitere Protokolle einbinden will.
Daher möchte ich am Beispiel von ssh zeigen wie man entsprechende Protokoll-Handler in Firefox einbaut. Die Vorgehensweise funktioniert so ab Firefox 3.6:

  1. Erstellen eines Scripts zum Öffnen des Links
  2. Öffnen von about:config in Firefox und bestätigen der Sicherheitsabfrage
  3. Erstellen eines neuen Boolean network.protocol-handler.expose.ssh über Rechtsklick und zuweisen des Werts false
  4. Schließen von Firefox und erneutes öffnen (in aktuellen Versionen nicht mehr nötig)
  5. Öffnen eines SSH-Links wie ssh://user@host:port
  6. Auswählen des Skripts zum Öffnen der Links, Haken für Auswahl merken setzen!

Hiermit ist es möglich beliebige Protokolle einzubinden, nur die Verwendung von file:// und smb:// lässt Firefox aus Sicherheitsgründen nicht zu!
Und damit nun nicht jeder ein eigenes Skript basteln muss noch zwei Beispielskripte, die ich mir mal auf die schnelle gebastelt hatte.
Die URLs haben hierbei folgenden Aufbau:

  • ssh://user@host:port
  • telnet://user@host:port
  • rdesktop://user@host:port
  • vnc://host:display

Das erste Beispielskript ist für die Verwendung unter Linux mit Gnome gedacht und zerlegt die URL und baut daraus einen Connectionstring für ssh oder telnet, welches innerhalb eines neuen Gnome-Terminals ausgeführt wird, und startet auch rdesktop und vncviewer.

#!/bin/bash
protocol=$(echo $1 | cut -d : -f 1)
address=$(echo $1 | cut -d / -f 3)
user=$(echo $address | grep @ | cut -d @ -f 1)
port=$(echo $address | grep : | cut -d : -f 2)
host=$(echo $address | cut -d @ -f 2 | cut -d : -f 1)
case $protocol in
ssh)
connectstring=$(echo "$([ -z $user ] || echo "$user@")$host$([ -z $port ] || echo "-p $port")")
gnome-terminal --window -e "$protocol $connectstring"
;;
telnet)
connectstring=$(echo "$host $([ -z $port ] || echo "$port")$([ -z $user ] || echo "-l $user")")
gnome-terminal --window -e "$protocol $connectstring"
;;
rdesktop)
connectstring=$(echo "$([ -z $user ] || echo "-u $user ")$host$([ -z $port ] || echo ":$port")")
rdesktop -g 1280x960 $connectstring
;;
vnc)
connectstring=$(echo "$host$([ -z $port ] || echo":$port")")
vncviewer $connectstring
;;
esac

Mein Beispielskript für Windows ist weniger elegant und kann nicht mit Ports umgehen, dieses öffnet Putty für ssh und telnet bzw. Realvnc für vnc mit festem Pfad sowie mstsc für Remotedesktop.

@ECHO OFF
set parameter=%1%
echo %parameter% |findstr ssh:// >nul:
if not errorlevel 1 GOTO SSH
echo %parameter% |findstr telnet:// >nul:
if not errorlevel 1 GOTO TELNET
echo %parameter% |findstr rdesktop:// >nul:
if not errorlevel 1 GOTO RDESKTOP
echo %parameter% |findstr vnc:// >nul:
if not errorlevel 1 GOTO VNC
GOTO END
:SSH
set host=%parameter:ssh://=%
START C:\Programme\PuTTY\putty.exe -ssh %host%
GOTO END
:TELNET
set host=%parameter:telnet://=%
START C:\Programme\PuTTY\putty.exe -telnet %host%
GOTO END
:RDESKTOP
set host=%parameter:rdesktop://=%
START %SystemRoot%\system32\mstsc.exe -v:%host%
GOTO END
:VNC
set host=%parameter:vnc://=%
START C:\Programme\RealVNC\VNC4\vncviewer.exe %host%
GOTO END
:END

Die Anwendung ist natürlich nicht nur auf Nagios bzw. Icinga beschränkt, auch Check_interfacetable_v3t integriert standardmäßig einen Link für den ssh- oder telnet-Zugriff auf das überwachte System, Mediawiki lässt es zu entsprechende URLs einzubauen und natürlich alle Software, die es erlaubt beliebige URLs anzugeben.
Ich hoffe der ein oder andere hat Verwendung hierfür und wünsche dann viel Spaß mit den nun noch schneller erreichten Systemen.

Dirk Götz
Dirk Götz
Principal Consultant

Dirk ist Red Hat Spezialist und arbeitet bei NETWAYS im Bereich Consulting für Icinga, Puppet, Ansible, Foreman und andere Systems-Management-Lösungen. Früher war er bei einem Träger der gesetzlichen Rentenversicherung als Senior Administrator beschäftigt und auch für die Ausbildung der Azubis verantwortlich wie nun bei NETWAYS.

6 Kommentare

  1. Thomas Gelf

    Hallo zusammen,
    und danke für das nützliche Howto. Eine Kleinigkeit möchte ich dazu noch anmerken, damit es nicht irgendwann zu einem bösen Erwachen kommt: die einzelnen Komponenten der URI will man bei so einem Vorhaben so paranoid als irgend möglich validieren. Es gibt sonst nämlich wenig was sich leichter kompromittieren lässt als ein Browser mit einer solchen Konfiguration.
    Grundsätzlich würde ich empfehlen, das Handler-Skript in einer höheren Skriptsprache als der Bash zu schreiben – da lebt es sich gleich schon viel sicherer. Und dann gilt:
    * Der Hostname sollte erst mit einem regulären Ausdruck überprüft werden, IPs (v4 und v6) sind selbstverständlich auch gültig. Falls es sich um keine IP handelt könnte ein prüfender DNS-Lookup im Skript nicht schaden – sicher ist sicher.
    * Auf den Benutzernamen wendet man im einfachsten Fall einen simplen regulären Ausdruck wie /^[a-z0-9\._-]+$/ an. Will man auch speziellere Benutzernamen unterstützen, dann grübelt man schon länger.
    * Der Port muss eine gültige Zahl sein, /^\d+$/ sowie 0 < port < 65536 wären ein guter Ansatz.
    Sicherer fühlen darf sich auch, wer die Escaping-Funktionen der Skriptsprache seines Vertrauens zu nutzen weiß. Wenn sich dann das Wrapper-Skript mit erfolgreichem Start des gewünschten Clients selbst sofort beendet, ohne auf das Ende der SSH-Sitzung zu warten – dann hat man alles vorbildlich gemacht.
    Wünsche gutes Gelingen!
    Lieben Gruß
    Thomas

    Antworten
  2. Mario

    Okay, das nenne ich doch mal einen interessanten und aussagekräftigen Beitrag. Ich werde dies mal demnächst umsetzen und euch ein Feedback dazu geben. Wenn dies so funktioniert, wäre das ein geniale Angelegenheit. Danke erst einmal für den Beitrag…

    Antworten
  3. Heiko

    Gott was bin ich froh diesen Artikel gefunden zu haben. Versucht bloß nicht, über den FF-Support auf Hilfe zu hoffen. Da blick ja keiner durch. Ich danke schon einmal vorab dem Autor.

    Antworten
  4. Steffen Mahl

    Jawollja – vielen Dank für diesen Artikel. Anscheinend geht es nicht nur mir so. Vielen Dank für diesen Artikel. Hast mir den Tag gerettet.

    Antworten
  5. Rico

    Hi Dirk,
    vielen Dank für diesen hilfreichen Artikel! So konnte ich meinem Firefox endlich beibringen, mit market://-Links für den Android Market/Google Play Store umzugehen, die auf manchen Webseiten zu finden sind und auf Android-Geräten offenbar automatisch funktionieren (und gewöhnlich die „Play Store“-App öffnen möchten), auf Desktop-Browsern aber eben nicht. Firefox öffnet mir nun die Seite der entsprechenden App direkt auf play.google.com. Hier die relevanten Teile des Bash-Skripts:
    #!/bin/bash
    market_id=$(echo $1 | cut -d = -f 2 | cut -d : -f 2)
    /usr/bin/firefox „https://play.google.com/store/apps/details?id=${market_id}“
    So wird Firefox beim Klicken auf einen Link wie market://search?q=pname:net.cdeguet.smartkeyboardpro.en direkt nach https://play.google.com/store/apps/details?id=com.google.android.inputmethod.latin weiter geschubst (bzw. genauer gesagt von einer externen Applikation aus Firefox mit dieser Adresse aufgerufen, was dann je nach Einstellungen und Tab-Handling in einem neuen Fenster/Tab resultiert oder im Öffnen des Links im aktuellen Tab/Fenster).
    Ergänzend noch ein Hinweis: scheinbar wurde das Protocol Handling in Firefox irgendwann geändert. Der Boolean „network.protocol-handler.expose.market“ hatte keinerlei Effekt (Firefox 24), weder mit „true“ noch mit „false“ als Wert. Stattdessen heißt mein Boolean nun „network.protocol-handler.external.market“ und hat den Wert „true“. Erst dadurch erschien das erwartete Popup zum Öffnen des Links. „network.protocol-handler.expose.market“ ist offenbar nicht (mehr) nötig.

    Antworten
  6. Rico

    Hmpf! Mir ist grade ein Fehler in meinem Kommentar aufgefallen. Der Beispiel-Market-Link sollte natürlich market://search?q=pname:com.google.android.inputmethod.latin heißen. Sorry, zu viele Copy&Paste-Buffers…

    Antworten

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Mehr Beiträge zum Thema Linux | Windows | Icinga | Nagios