Öffnen Sie ein Fenster auf einer Remote-X-Anzeige (warum kann die Anzeige nicht geöffnet werden)?


81

Es war einmal,

DISPLAY=:0.0 totem /path/to/movie.avi

Wenn ich von meinem Laptop movie.aviauf meinen Desktop gehe, wird Totem auf meinem Desktop abgespielt.

Jetzt gibt es den Fehler:

No protocol specified
Cannot open display:

Ich habe Debian squeeze neu installiert, als es auf beiden Computern stabil lief, und ich glaube, ich habe die Konfiguration gebrochen.

Ich habe darüber gegoogelt und kann für mein ganzes Leben nicht herausfinden, was ich tun soll.

(VLC hat eine HTTP-Schnittstelle, die funktioniert, aber nicht so praktisch wie ssh ist.)

Das gleiche Problem tritt auf, wenn ich versuche, dies von einem Cron-Job auszuführen.


1
Zeigt Ihr Remote-Computer eine .Xauthority-Datei an? Die andere offensichtliche Frage ist, ob Ihr SSH-Server und Ihr Client so konfiguriert sind, dass X-Weiterleitung möglich ist. Welchen Befehl haben Sie für ssh verwendet?
Faheem Mitha

1
versuche ich X weiterzuleiten? Ich möchte, dass der Befehl auf dem Host ausgeführt wird, nicht auf dem Client. Mein ssh-Befehl lautet einfach ssh me @ host locate .Xauthority auf dem Host-Computer stimmt nicht mit Dateien überein.
Justin Cress

Wie Faheem schon sagt, gibt es eine gute Änderung , die Ihr Problem zurückzuführen ist , totemnicht der Suche nach Ihrem X - Cookie, und müssen Sie festlegen , XAUTHORITYauf den richtigen Wert, dh der Wert in der regulären Sitzung auf Ihrem Desktop. Lesen Sie Linux: wmctrl kann die Anzeige nicht öffnen, wenn die Sitzung für einen bestimmten Hintergrund über ssh + screen gestartet wird . Siehe auch die entsprechende Antwort. Kann ich als Root ein Grafikprogramm auf dem Desktop eines anderen Benutzers starten? .
Gilles

1
Ordnung, physisch am Computer sitzt und echo $ XAUTHORITY Eingabe gibt / var / run / gdm3 / Auth-for-jcress-bb32gX / Datenbank in der SSH - Sitzung, = echo $ DISPLAY eingeben (der Pfad oben) wird das Problem nicht lösen
Justin Cress

1
Ich beschuldige GDM3, warum konnte sie nicht einfach gehalten haben $XAUTHORITYan ~/.Xauthoritywie jeder erwartet es zu sein.
Arrowmaster

Antworten:


78

(Unter Linux angepasst : wmctrl kann die Anzeige nicht öffnen, wenn die Sitzung über ssh + screen gestartet wird. )

DISPLAY und AUTHORITY

Ein X-Programm benötigt zwei Informationen, um eine Verbindung zu einer X-Anzeige herzustellen.

  • Es braucht die Adresse des Displays, die in der Regel ist , :0wenn Sie angemeldet sind in lokal oder :10, :11usw. , wenn Sie in der Ferne angemeldet sind (aber die Zahl kann je nach ändern , wie viele X - Verbindungen aktiv sind). Die Adresse der Anzeige wird normalerweise in der DISPLAYUmgebungsvariablen angezeigt .

  • Es benötigt das Passwort für die Anzeige. X-Display-Passwörter werden als magische Cookies bezeichnet . Magische Cookies werden nicht direkt angegeben: Sie werden immer in X-Authority-Dateien gespeichert. Hierbei handelt es sich um eine Sammlung von Datensätzen in der Form „Display :42hat Cookie 123456“. Die X-Normdatei wird normalerweise in der XAUTHORITYUmgebungsvariablen angegeben. Ist dies $XAUTHORITYnicht der Fall, werden die Programme verwendet ~/.Xauthority.

Sie versuchen, auf die Fenster zu reagieren, die auf Ihrem Desktop angezeigt werden. Wenn Sie die einzige Person sind, die Ihren Desktopcomputer verwendet, ist der Anzeigename sehr wahrscheinlich :0. Es ist schwieriger, den Speicherort der X-Normdatei zu finden, da gdm, wie unter Debian squeeze oder Ubuntu 10.04 eingerichtet, in einer Datei mit einem zufällig generierten Namen enthalten ist. (Sie hatten zuvor kein Problem, da frühere Versionen von gdm die Standardeinstellung verwendeten, dh Cookies, die in gespeichert waren ~/.Xauthority.)

Abrufen der Werte der Variablen

Hier sind einige Möglichkeiten, die Werte von DISPLAYund zu ermitteln XAUTHORITY:

  • Sie können eine Bildschirmsitzung systematisch von Ihrem Desktop aus starten, möglicherweise automatisch in Ihren Anmeldeskripten (von ~/.profile; tun dies jedoch nur, wenn Sie sich unter X anmelden : Testen Sie, ob DISPLAYein Wert festgelegt ist, der mit beginnt :(dies sollte alle Fälle abdecken, in denen Sie wahrscheinlich sind) begegnen)). In ~/.profile:

    case $DISPLAY in
      :*) screen -S local -d -m;;
    esac
    

    Dann in der SSH-Sitzung:

    screen -d -r local
    
  • Sie können auch die Werte von DISPLAYund XAUTHORITYin einer Datei speichern und die Werte abrufen. In ~/.profile:

    case $DISPLAY in
      :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
    esac
    

    In der SSH-Sitzung:

    . ~/.local-display-setup.sh
    screen
    
  • Sie können die Werte von DISPLAYund XAUTHORITYaus einem laufenden Prozess ermitteln. Dies ist schwieriger zu automatisieren. Sie müssen die PID eines Prozesses ermitteln, der mit der Anzeige verbunden ist, an der Sie arbeiten möchten, und dann die Umgebungsvariablen von /proc/$pid/environ( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')¹) abrufen.

Kopieren der Cookies

Ein anderer Ansatz (auf Vorschlag von Arrowmaster ) besteht darin, nicht zu versuchen, den Wert von $XAUTHORITYin der ssh-Sitzung abzurufen , sondern die X-Sitzung dazu zu bringen, ihre Cookies zu kopieren ~/.Xauthority. Da die Cookies jedes Mal generiert werden, wenn Sie sich anmelden, ist es kein Problem, wenn Sie veraltete Werte beibehalten ~/.Xauthority.

Es kann ein Sicherheitsproblem geben, wenn auf Ihr Basisverzeichnis über NFS oder ein anderes Netzwerkdateisystem zugegriffen werden kann, mit dem Remoteadministratoren den Inhalt anzeigen können. Sie müssten sich trotzdem irgendwie mit Ihrem Computer verbinden, es sei denn, Sie haben X-TCP-Verbindungen aktiviert (Debian hat sie standardmäßig deaktiviert). Für die meisten Menschen gilt dies entweder nicht (kein NFS) oder ist kein Problem (keine X TCP-Verbindungen).

Fügen Sie die folgenden Zeilen zu ~/.xprofileoder ~/.profile(oder einem anderen Skript, das beim Anmelden gelesen wird) hinzu, um Cookies zu kopieren, wenn Sie sich bei Ihrer Desktop X-Sitzung anmelden:

case $DISPLAY:$XAUTHORITY in
  :*:?*)
    # DISPLAY is set and points to a local display, and XAUTHORITY is
    # set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
    XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac

¹ Im Prinzip dieses Zitat richtiges fehlt, aber in diesem speziellen Fall $DISPLAYund $XAUTHORITYwird keine Shell - Metazeichen enthalten.


2
Eine Möglichkeit, dies zu automatisieren, besteht darin, eine zu erstellen, ~/.xprofiledie nur während der X-Anmeldung ausgeführt werden sollte, und sie ~/.Xauthoritymit den richtigen Informationen erstellen / aktualisieren zu lassen. Wäre ein symbolischer Link ausreichend?
Arrowmaster

@Arrowmaster: Das ist ein guter Vorschlag. Ich hatte nicht daran gedacht. Dies funktioniert nicht in allen Fällen, zum Beispiel, wenn Sie sich in mehr als einer X-Sitzung anmelden (auf verschiedenen Terminals, mit VNC, ...), aber es ist einfach und für den typischen Gebrauch gut genug. Eine symbolische Verknüpfung ist der beste Weg. Hmm, eigentlich gibt es eine bessere, einfachere Möglichkeit: Sie können die Informationen in kopieren~/.Xauthority .
Gilles

1
Würde man den Fall mehrerer $ DISPLAYs lösen, wenn man so etwas wie xauth extract - $DISPLAY | xauth -f "$HOME/.Xauthority" merge -in ~/.xprofileeinsetzt?
Arrowmaster

@Arrowmaster: Welches Problem sehen Sie bei mehreren Displays? Obwohl Ihr Code im Prinzip ein wenig sauberer ist, da Sie nur Informationen über die Anzeige extrahieren, die Sie interessieren, sehe ich nichts falsches an einer einfachen Zusammenführung im Fall des Fragestellers oder in der Tat außerhalb sehr ungewöhnlicher Umstände.
Gilles

1
Das Auslesen der Umgebung aus einem vorhandenen Prozess, der mit dem Display verbunden ist, ist unerwartet und erfreulich böse. Ich stimme voll und ganz zu. Unix.SE benötigt dafür ein Evil Genius ™ Abzeichen.
Derobert

19

Ich habe dieses Problem durch Hinzufügen gelöst

xhost +si:localuser:$USER

zu ~/.xprofile. Ich weiß nicht, ob dies insgesamt sicher ist (ich wäre sehr daran interessiert zu hören, was sachkundigere Leute denken), aber ich vermute, dass es viel besser ist, als die Zugriffskontrolle (mit xhost +) auszuschalten, wie es allgemein bei Ihnen vorgeschlagen wird Google für dieses Problem.


1
localuserServerinterpretierte Adressen sind absolut sicher. Debian tut dies sogar standardmäßig als Teil des Anmeldevorgangs (in /etc/X11/Xsession.d/35x11-common_xhost-local). Weitere Informationen finden Sie auf der Xsecurity-Manpage .
Sam Morris

Wenn Sie in einem LAN sind, xhost +ist wahrscheinlich in den meisten Fällen genug ...
Alexis Wilke

Können Sie erklären, was dieser Befehl bedeutet?
Alpha_989

@ alpha_989: Bedeutet "Gewähren Sie [+] Zugriff auf alle lokal ausgeführten [localuser] -Anwendungen, die als ich [$ USER] ausgeführt werden." Das "si" ist nur Kleber (siehe xhost(1)und Xsecurity(7)für Dokumente). Von selbst, diesen Befehl ist nicht erlaubt , jede Art von Remote - Zugriff oder X11 - Weiterleitung (für die der „Magic Cookie“ Mechanismus ist in der Regel bevorzugt über xhost).
Kevin

7

Du musst export DISPLAY=:0.0


Nein. Unix erfordert keinen Export, wenn die Variable in dieselbe Zeile geschrieben wird. Diese Variable bleibt wirksam, bis die Zeile endet.
Alexis Wilke

In der Tat hast du recht.
Asoundmove

Diese Antwort ist eindeutig falsch und sollte gelöscht werden.
Piotr Dobrogost

Wusste nicht, dass nur DISPLAY =: 0.0 den Variablennamen setzen würde. Vielen Dank, @asoundmove. Ich denke jedoch: 0.0 ist der Wert für die Variable DISPLAY auf dem Server-Display. Wenn Sie sich von Putty aus anmelden, sollte die Variable DISPLAY 10 oder höher sein. es sollte also DISPLAY =: 10
alpha_989

3

Funktioniert bei mir, Debian Wheezy -> Ubuntu Trusty.

Hinweis: In diesem Fall wird auf dem Server kein Display-Manager ausgeführt. Es handelt sich um eine "kopflose" virtuelle Maschine ohne angeschlossene Grafikkarte oder Monitor.

bob@laptop:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
bob@laptop:~$ ssh -C -R 6000:127.0.0.1:6000 alice@server
X11 forwarding request failed on channel 0
alice@server:~$ export DISPLAY=:0.0
alice@server:~$ xterm

Die X-Anzeige auf dem Laptop zeigt die Ausgabe von xterm an, das auf dem Server ausgeführt wird.

Debuggen mit:

bob@laptop:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
bob@laptop:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
alice@server:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
alice@server:~$ strace xterm

strace wird eine Menge blutiger Details über das, was es tut, verschütten, sollten Sie in der Lage sein zu erraten, wo es stecken bleibt - auf eine Verbindung warten oder was auch immer.

In einer Zeile ..

ssh -C -R 6000:127.0.0.1:6000 alice@server "DISPLAY=:0.0 xterm"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.