it-swarm.com.de

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

Es war einmal,

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

wenn ich von meinem Laptop auf meinen Desktop ssh 'würde, würde das Totem movie.avi auf meinem Desktop abspielen.

Jetzt gibt es den Fehler:

No protocol specified
Cannot open display:

Ich habe Debian Squeeze neu installiert, als es auf beiden Computern stabil war, 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 verfügt über eine funktionierende HTTP-Schnittstelle, die jedoch nicht so praktisch ist wie ssh.)

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

83
justin cress

(Angepasst von Linux: wmctrl kann die Anzeige nicht öffnen, wenn die Sitzung über ssh + screen gestartet wurde )

ANZEIGE und BEHÖRDE

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

  • Es benötigt die Adresse der Anzeige, die normalerweise :0 Ist, wenn Sie lokal angemeldet sind, oder :10, :11 Usw., wenn Sie remote angemeldet sind (aber Die Anzahl kann sich ändern, je nachdem, wie viele X-Verbindungen aktiv sind. Die Adresse der Anzeige wird normalerweise in der Umgebungsvariablen DISPLAY angegeben.

  • 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-Berechtigungsdateien gespeichert, bei denen es sich um eine Sammlung von Datensätzen der Form "Anzeige :42 Hat Cookie 123456" Handelt. Die X-Berechtigungsdatei wird normalerweise in der Umgebungsvariablen XAUTHORITY angegeben. Wenn $XAUTHORITY Nicht gesetzt ist, verwenden Programme ~/.Xauthority.

Sie versuchen, auf die Fenster zu reagieren, die auf Ihrem Desktop angezeigt werden. Wenn Sie die einzige Person sind, die Ihren Desktop-Computer verwendet, lautet der Anzeigename höchstwahrscheinlich :0. Es ist schwieriger, den Speicherort der X-Berechtigungsdatei zu finden, da gdm unter Debian Squeeze oder Ubuntu 10.04 in einer Datei mit einem zufällig generierten Namen eingerichtet ist. (Sie hatten zuvor kein Problem, da frühere Versionen von gdm die Standardeinstellung verwendeten, d. H. In ~/.Xauthority Gespeicherte Cookies.)

Abrufen der Werte der Variablen

Hier sind einige Möglichkeiten, um die Werte von DISPLAY und XAUTHORITY zu erhalten:

  • Sie können eine Bildschirmsitzung systematisch von Ihrem Desktop aus starten, möglicherweise automatisch in Ihren Anmeldeskripten (ab ~/.profile; Dies ist jedoch nur möglich, wenn Sie sich unter X anmelden: Testen Sie, ob DISPLAY auf einen Wert gesetzt ist, der beginnt mit : (das sollte alle Fälle abdecken, auf die Sie wahrscheinlich stoßen)). 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 DISPLAY und XAUTHORITY in 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 DISPLAY und XAUTHORITY aus 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.

Cookies kopieren

Ein anderer Ansatz (nach einem Vorschlag von Arrowmaster ) besteht darin, nicht zu versuchen, den Wert von $XAUTHORITY In der SSH-Sitzung zu erhalten, sondern die X-Sitzung ihre Cookies in ~/.Xauthority. Da die Cookies bei jeder Anmeldung generiert werden, ist es kein Problem, wenn Sie veraltete Werte in ~/.Xauthority Behalten.

Es kann ein Sicherheitsproblem auftreten, wenn auf Ihr Home-Verzeichnis über NFS oder ein anderes Netzwerkdateisystem zugegriffen werden kann, mit dem Remoteadministratoren dessen Inhalt anzeigen können. Sie müssten immer noch eine Verbindung zu Ihrem Computer herstellen, es sei denn, Sie haben X TCP -Verbindungen aktiviert (Debian hat sie standardmäßig deaktiviert). Für die meisten Benutzer gilt dies entweder nicht (nein NFS) oder ist kein Problem (keine X TCP Verbindungen).

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

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 fehlt dies an korrekten Anführungszeichen, aber in diesem speziellen Fall enthalten $DISPLAY Und $XAUTHORITY Kein Shell-Metazeichen.

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 interessiert zu hören, was sachkundigere Leute denken), aber ich vermute, dass es viel besser ist, als die Zugriffskontrolle auszuschalten (mit xhost +) wie allgemein vorgeschlagen, wenn Sie für dieses Problem googeln.

20
edam

Du brauchst export DISPLAY=:0.0

7
asoundmove

Funktioniert für mich, debian wheezy -> ubuntu vertrauenswürdig.

Hinweis: In diesem Fall wird auf dem Server kein Display-Manager ausgeführt, sondern eine virtuelle Maschine ohne Kopf, an die keine Grafikkarte oder kein Monitor angeschlossen ist.

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

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

Debuggen mit:

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

strace wird eine Menge blutiger Details darüber verschütten, was es tut. Sie sollten 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 [email protected] "DISPLAY=:0.0 xterm"
3
jmullee