No protocol specified
Error: Can’t open display: (null)
Failed creating new xdo instance
» english version
Der “Can’t open display” Fehler ist typisch, wenn man versucht mit einem Linux-Shell-Skript auf ein grafisches Programm zuzugreifen: In unserem Beispiel soll das Skript mit der Erweiterung “xdotool” auf einen laufenden Firefox zugreifen und den Befehl zum Neuladen der Seite senden – allerdings automatisch, ohne dass man am Linux-Rechner (zum Beispiel einem Raspberry Pi) sitzt.
Maus- und Tastatur-Befehle senden: Das geht mit xdotool
Nachdem man xdotool installiert hat (unter Raspbian mit “sudo apt-get install xdotool”) kann man mit dem Programm Maus- und Tastatur-Befehle an laufende grafische Programme senden – in unserem Beispiel soll Firefox die aktuelle Seite einfach nur neuladen: Wir senden daher die Taste “F5”, um das Neuladen der angezeigten Webseite zu erzwingen. Ist Firefox das einzige Programm, das mit einem Fenster geöffnet ist, reicht dazu dieser Befehl:
xdotool getactivewindow
xdotool key F5
Ruft man das Programm aber über eine SSH Verbindung auf – oder mit einem Shell-Skript, funktioniert das nicht: Es erscheint die Fehlermeldung “Error: Can’t open display: (null) – Failed creating new xdo instance”.
Lösung: So behebt man den “Can’t open display: (null)” Error!
Die Lösung ist dabei recht einfach (und sollte auch für andere Anwendungen, ohne das xdotool, funktionieren!). Zunächst setzt man das Display auf “0”, zusätzlich muss man noch die XAUTHORITY angeben. Das Skript zum Neuladen der Webseite im Firefox sieht daher jetzt so aus:
#!/bin/bash
export DISPLAY=":0"
export XAUTHORITY=/home/pi/.Xauthority
xdotool getactivewindow
xdotool key F5
Startet man das Skript jetzt mit “sh /home/pi/sh firefox-reload.sh” (oder einem anderen Usernamen nach “home”, wenn man nicht als User “Pi” angemeldet ist!), lädt der Firefox die Seite neu – ohne Fehlermeldung. Statt dem xdotool kann man so aber auch auf andere grafische Anwendungen zugreifen, die sonst eine Display-Anzeige voraussetzen.
Funktioniert das mit dem aktuellen User nicht und man erhält weiterhin den folgenden Fehler beim Starten des Skripts:
No protocol specified
Error: Can’t open display: (null)
Failed creating new xdo instance
…hilft vielleicht ein User-Wechsel oder die Nutzung des Super-Users mit sudo. In unserem Beispiel würde man das Skript dann mit diesem Befehl aufrufen:
sudo sh firefox-reload.sh
Um einen Linux-User (in unserem Beispiel FHEM) sudo Rechte zu geben, haben wir hier eine Anleitung!