[geloest] SSH, X11Forwarding, "Can't open display"

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

[geloest] SSH, X11Forwarding, "Can't open display"

Beitrag von Cae » 24.10.2012 03:50:27

Hallo zusammen,

auf einer Wheezy-Box möchte ich letztendlich Programme mit grafischen Oberflächen unter einem anderen Benutzer starten, ohne umloggen zu müssen. Die Idee ist, Xephyr (Debianxserver-xephyr) über ssh userb@localhost zu starten, aber so weit komme ich gar nicht.

Relevant sind dafür nach meinen Nachforschungen die beiden schon per default gesetzten Variablen

Code: Alles auswählen

# /etc/ssh/sshd_config
X11Forwarding yes
X11DisplayOffset 10
und die von mir hinzugefügten

Code: Alles auswählen

# /etc/ssh/ssh_config
Host *
[…]
    ForwardX11 yes
    ForwardX11Trusted yes
in der globen Client-Konfiguration. Danach hatte ich den sshd reloaden lassen und ssh -X userb@localhost probiert:

Code: Alles auswählen

% ssh -tX userb@localhost sh
X11 forwarding request failed on channel 0
$ 
(Das Verhalten ist auch ohne die Änderungen gleich.) Der spannende Teil von -vv sieht so aus:

Code: Alles auswählen

debug1: Entering interactive session.
debug2: callback start
debug2: x11_get_proto: /usr/bin/xauth  list :0 2>/dev/null
debug1: Requesting X11 forwarding with authentication spoofing.
debug2: channel 0: request x11-req confirm 1
debug2: client_session2_setup: id 0
debug2: fd 3 setting TCP_NODELAY
debug2: channel 0: request pty-req confirm 1
debug1: Sending environment.
debug1: Sending env LANG = de_DE.UTF-8
debug2: channel 0: request env confirm 0
debug1: Sending command: sh
debug2: channel 0: request exec confirm 1
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel_input_status_confirm: type 100 id 0
X11 forwarding request failed on channel 0
debug2: channel_input_status_confirm: type 99 id 0
debug2: PTY allocation request accepted on channel 0
Angenommen, X-Forwarding würde nun funktionieren, sollte ein in der SSH-Shell eingetipptes xclock ein lokales X-Fenster starten. Das passiert aber nicht:

Code: Alles auswählen

$ xclock
Error: Can't open display: 
$ echo -n $DISPLAY | wc -c
0
Macht ja auch irgendwo Sinn, wenn $DISPLAY nicht gesetzt ist. Falls es auf :0.0 steht, oder :0 oder irgendein (von mir probierter) anderer Wert, lautet die Meldung

Code: Alles auswählen

$ xclock
No protocol specified
Error: Can't open display: :0.0
Was ist der korrekte Wert für $DISPLAY, bzw. liegt es überhaupt daran? Die Dokumentationen (tldp beispielsweise) erklären lang und breit, wie man X zum Laufen bekommt, oder SSH, aber X11-Forwarding scheint grundsätzlich und immer zu gehen… Andere User haben entweder kein xauth installiert (habe ich), kein X11Forwarding in der sshd_config (habe ich), wollen irgendwelche Windows-X-Server zum Laufen bekommen (tja).

Gruß Cae

P.S.: Wer mir verrät, dass ein sudo -u userb Xephyr oder etwas in der Richtung auch geht, gerne. Löst mein Problem, aber die SSH-Unstimmigkeiten nicht.
Zuletzt geändert von Cae am 13.02.2013 20:25:32, insgesamt 1-mal geändert.
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
shoening
Beiträge: 917
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von shoening » 24.10.2012 07:39:53

Hi Cä,

hast Du das schonmal ohne die Client-Konfiguration versucht?

Bei mir liefert dann

Code: Alles auswählen

echo $DISPLAY
localhost:10.0
Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

Benutzeravatar
Saxman
Beiträge: 4233
Registriert: 02.05.2005 21:53:52
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: localhost

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von Saxman » 24.10.2012 07:56:10

Cae hat geschrieben: P.S.: Wer mir verrät, dass ein sudo -u userb Xephyr oder etwas in der Richtung auch geht, gerne. Löst mein Problem, aber die SSH-Unstimmigkeiten nicht.
Den Umweg über X-Forwarding spare ich mir auf localhost. Unter Gnome habe ich das immer mit gksu gemacht, unter KDE mache ich das über kdesu. Hier laufen mehrere Programme unter anderen Benutzern ohne Probleme. Wenn es also nur darum geht...
"Unix is simple. It just takes a genius to understand its simplicity." - Dennis Ritchie

Debian GNU/Linux Anwenderhandbuch | df.de Verhaltensregeln | Anleitungen zum Review und zum Verfassen von Wiki Artikeln.

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von hupfdule » 24.10.2012 12:24:03

Debian (und die meisten anderen Distributionen) starten den XServer standardmäßig mit der Option "-nolisten tcp". Damit ist das Forwarding auf diesen Server grundsätzlich unterbunden.
Umstellen kannst du das in der Datei "/etc/X11/xinit/xserverrc" (benötigt allerdings einen Restart des XServers).

Benutzeravatar
debdog
Beiträge: 652
Registriert: 11.02.2007 10:53:12
Wohnort: Do,womrkoihochdeitschko

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von debdog » 24.10.2012 15:21:27

Cae hat geschrieben:auf einer Wheezy-Box möchte ich letztendlich Programme mit grafischen Oberflächen unter einem anderen Benutzer starten, ohne umloggen zu müssen. Die Idee ist, Xephyr (Debianxserver-xephyr) über ssh userb@localhost zu starten, aber so weit komme ich gar nicht.
Ich könnte die Problemstellung nicht richtig verstanden haben, aber wenn Du wirklich nur ein Programm starten möchtest, dann brauchst Du dafür keinen verschachtelten X-Server. Einfach einloggen und das Programm starten.
Hier, allerdings noch unter Squeeze, funzt das ohne Probleme mit der selben ssh-Konfig, die Du angegeben hast und ohne "/etc/X11/xinit/xserverrc" abzuändern.

Code: Alles auswählen

user1@PC:~$ ssh -l user2 localhost
user2@localhost's password: 
[...]
user2@PC:~$ scite &
[1] 2129
Oben gemachte Angaben, Falls nicht anderweitig Erwähnt, beziehen sich auf Debian Stable (Squeeze) amd64.
"Die Einen glauben zu Wissen, die Anderen wissen zu Glauben."

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von r900 » 24.10.2012 16:23:35

Saxman hat geschrieben:
Cae hat geschrieben: P.S.: Wer mir verrät, dass ein sudo -u userb Xephyr oder etwas in der Richtung auch geht, gerne. Löst mein Problem, aber die SSH-Unstimmigkeiten nicht.
Den Umweg über X-Forwarding spare ich mir auf localhost. Unter Gnome habe ich das immer mit gksu gemacht, unter KDE mache ich das über kdesu. Hier laufen mehrere Programme unter anderen Benutzern ohne Probleme. Wenn es also nur darum geht...
Genau für diesen Zweck gibt es doch Debiansux.

Code: Alles auswählen

user@host~$ sux testuser xclock
Das ist ein wrapper für su. Wenn du dir das Script anschaust siehst du auch welche Rechte auf testuser transferiert werden müssen.

Du kannst das aber auch umgehen indem du Xephyr mit dem Benutzer startest unter dem die aktuelle X-Sitzung läuft.

Code: Alles auswählen

user@host::~$ Xephyr :2 &
user@host:~$ su testuser
testuser@host:~$ DISPLAY=:2 xclock
Ich denke so ist das eigentlich gedacht oder hab ich da was falsch verstanden? Weshalb sollte testuser Xephyr starten, reicht doch wenn er die Programm startet die darin laufen.

Benutzeravatar
Saxman
Beiträge: 4233
Registriert: 02.05.2005 21:53:52
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: localhost

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von Saxman » 24.10.2012 19:05:27

r900 hat geschrieben:
Saxman hat geschrieben:
Cae hat geschrieben: P.S.: Wer mir verrät, dass ein sudo -u userb Xephyr oder etwas in der Richtung auch geht, gerne. Löst mein Problem, aber die SSH-Unstimmigkeiten nicht.
Den Umweg über X-Forwarding spare ich mir auf localhost. Unter Gnome habe ich das immer mit gksu gemacht, unter KDE mache ich das über kdesu. Hier laufen mehrere Programme unter anderen Benutzern ohne Probleme. Wenn es also nur darum geht...
Genau für diesen Zweck gibt es doch Debiansux.

Code: Alles auswählen

user@host~$ sux testuser xclock
Das ist ein wrapper für su. Wenn du dir das Script anschaust siehst du auch welche Rechte auf testuser transferiert werden müssen.
Viele Wege führen nach Rom...
"Unix is simple. It just takes a genius to understand its simplicity." - Dennis Ritchie

Debian GNU/Linux Anwenderhandbuch | df.de Verhaltensregeln | Anleitungen zum Review und zum Verfassen von Wiki Artikeln.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von Cae » 24.10.2012 23:09:58

shoening hat geschrieben:hast Du das schonmal ohne die Client-Konfiguration versucht?
Ja, auch dann bleibt $DISPLAY leer. Irgendwas stimmt da nicht.
Saxman hat geschrieben:Unter Gnome habe ich das immer mit gksu gemacht, unter KDE mache ich das über kdesu. Hier laufen mehrere Programme unter anderen Benutzern ohne Probleme. Wenn es also nur darum geht...
Die Idee war u.A. auch mal, passwortlose SSH-Keys zu verwenden, um übertrieben häufiges Einloggen zu vermeiden. Ich meine aber einst von einem gksudo (?) gehört zu haben, das die sudoers verwendet und den X-Kram drum herum strickt. Das klingt nach dem passenden Weg.

Nur leider macht gksudo irgendwo die Grätsche, ich bekomme

Code: Alles auswählen

% gksudo -u userb xterm

(gksudo:11142): GLib-CRITICAL **: g_str_has_prefix: assertion `str != NULL' failed
Das passiert auch bei beliebigen anderen Programmen als Argument. (Und dieser verschwenderische Kerl, der die überflüssige Newline da reingepackt hat, gehört auf Typenraddrucker umgeschult.)
hupfdule hat geschrieben:mit der Option "-nolisten tcp". Damit ist das Forwarding auf diesen Server grundsätzlich unterbunden.
Aha, über diese Option war ich früher mal gestolpert (und da hatte das Forwarding auch geklappt, kann aber unabhängig sein). Übrigens bleibt bei mir immernoch -nolisten tcp in top stehen, des Rätsel Lösung: xinit/xserverrc scheint nur bei manuellem xinit zu gelten, mein WDM hat das seperat in der /etc/X11/wdm/Xservers stehen. Da steht auch

Code: Alles auswählen

# - SECURITY NOTE: Always pass the "-nolisten tcp" option to the X
#   server, as shown in the examples below, unless you know you
#   need the X server listening on a TCP port.  Omitting this
#   option can expose your X server to attacks from remote hosts.
#   Note also that SSH's X11 port-forwarding option works even with
#   X servers that do not listen on a TCP port, so you do not need
#   to remove the "-nolisten tcp" option for SSH's benefit.
… was sich mit meiner Beobachtung deckt, denn mit nicht-deaktiviertem TC-Protokoll geht's auch nicht.
debdog hat geschrieben:nur ein Programm starten möchtest, dann brauchst Du dafür keinen verschachtelten X-Server.
Das weiß ich ehrlich gesagt selbst noch nicht, aber wenn denn ein einzelnes laufen würde, würde Xephyr ja auch starten. Eigentlich macht das keinen Sinn, ich will ja keine Desktops testen, sondern Programme.
r900 hat geschrieben:Weshalb sollte testuser Xephyr starten, reicht doch wenn er die Programm startet die darin laufen.
Aha! Natürlich, das erklärt auch die Verwirrung, nachdem ich mit sux Xephyr gestartet hatte und anschließend (aus einem usera-Terminal) probehalber awesome im zweiten X gestartet hatte. Da hat das X userb gehört, aber die Session eben noch usera.

Mein Versuch, sux auf sudo umzustricken, geht übrigens in die Hose:

Code: Alles auswählen

--- /usr/bin/sux        2010-10-10 21:19:05.000000000 +0200
+++ tmp/sux     2012-10-24 23:00:20.479038912 +0200
@@ -340 +340 @@
-exec su $sux_su_opts -c "$sux_xauth_cmd \
+exec sudo -u $sux_su_opts sh -c "$sux_xauth_cmd \
Es wird wohl der Cookie nicht kopiert.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

uname
Beiträge: 12474
Registriert: 03.06.2008 09:33:02

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von uname » 25.10.2012 08:06:00

Etwas offtopic:
Ich meine aber einst von einem gksudo (?) gehört zu haben
Wohl zu oft Ubuntu genutzt ;-) Richtiger wäre der Befehl "gksu" aus Debiangksu, welches jedoch auch gksudo enthält. Wenn doch "gksudo" dann aber bitte /etc/sudoers mit "visudo" korrekt konfigurieren.

Benutzeravatar
habakug
Moderator
Beiträge: 4314
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von habakug » 25.10.2012 12:45:00

Hallo!

Ich kann das Problem hier insoweit nachstellen, dass es aus einer root-Shell *nicht* geht:

Code: Alles auswählen

root@work ~# echo $DISPLAY

root@work ~# xhost
xhost:  unable to open display ""
root@work ~# ssh -X user2@localhost
user2@localhost's password: 
Last login: Thu Oct 25 12:17:21 2012 from work
user2@work ~$ echo $DISPLAY

user2@work ~]$ xhost
xhost:  unable to open display ""
user2@work ~$ gedit &
[1] 2216
user2@work ~$ 
** (gedit:2216): WARNING **: Could not open X display
Anzeige kann nicht geöffnet werden:
Aus einer User-Shell funktioniert es jedoch hervorragend:

Code: Alles auswählen

user1@work ~$ xhost
access control enabled, only authorized clients can connect
SI:localuser:user1
user1@work ~$ echo $DISPLAY
:1
user1@work ~$ ssh -X user2@localhost
user2@localhost's password: 
Last login: Thu Oct 25 12:19:40 2012 from work
user2@work ~$ echo $DISPLAY
localhost:10.0
user2@work ~$ xhost
access control disabled, clients can connect from any host
user2@work ~$ gedit &
[1] 2273
Eben auf einer anderen Maschine mußte noch als User

Code: Alles auswählen

user1@work2 ~# xhost +localhost
ausgeführt werden.

Gruß, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

uname
Beiträge: 12474
Registriert: 03.06.2008 09:33:02

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von uname » 25.10.2012 13:10:33

Eigentlich doch logisch. Beim ersten Beispiel gehört natürlich nicht "root" das Display sondern dem angemeldeten Benutzer. Ein

Code: Alles auswählen

xhost +localhost
als normaler Benutzer hätte auch dort wahrscheinlich geholfen. Bevor man eine SSH-Verbindung mit X aufbaut sollte auch z.B. ein "xterm" für den Ursprungs-Benutzer gehen. Vorher braucht man gar nicht anfangen.

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von r900 » 25.10.2012 13:17:41

Also dann wäre es doch am einfachsten wenn Benutzer A Benutzer B den Zugriff auf die X-Session erlaubt:

Code: Alles auswählen

usera@host:~$ xhost +si:localuser:userb
localuser:userb being added to access control list
usera@host:~$ sudo -u userb xclock
Dann musst du nur sudo so konfigurieren dass usera Befehle als userb ausführen darf, eventuell auch ohne Passwortabfrage.

Das entscheidende bei habakugs erstem Beispiel ist meiner Meinung nach dass die DISPLAY-Variable nicht gesetzt ist.

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von hupfdule » 25.10.2012 16:12:08

Cae hat geschrieben:

Code: Alles auswählen

# - SECURITY NOTE: Always pass the "-nolisten tcp" option to the X
#   server, as shown in the examples below, unless you know you
#   need the X server listening on a TCP port.  Omitting this
#   option can expose your X server to attacks from remote hosts.
#   Note also that SSH's X11 port-forwarding option works even with
#   X servers that do not listen on a TCP port, so you do not need
#   to remove the "-nolisten tcp" option for SSH's benefit.
… was sich mit meiner Beobachtung deckt, denn mit nicht-deaktiviertem TC-Protokoll geht's auch nicht.
Ja, wenn SSHs -X Option funktioniert, dann läuft das. Wenn das jedoch im SSH-Server abgeschaltet wurde, dann muss auf eben jenem Server die DISPLAY-Variable per Hand gesetzt werden (z.B. 192.168.1.55:0.0). Und dann wird diese Option eben relevant. Aber wie mir gerade auffällt, scheint das bei dir ja gar nicht der Fall zu sein und damit sollte dir die Option wirklich egal sein. :-)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: SSH, X11Forwarding, "Can't open display"

Beitrag von Cae » 25.10.2012 16:53:53

uname hat geschrieben:Wohl zu oft Ubuntu genutzt ;-)
Verwenden die das auch? Tz, nö, Synaptic hat sich in Squeeze/GNOME2 damit immer uid 0 verschafft… aber das ist auch schon lange her.
uname hat geschrieben:Wenn doch "gksudo" dann aber bitte /etc/sudoers mit "visudo" korrekt konfigurieren.
Jepp, hab' ich. Das ist ja das Schöne an sudo, dass es eben kein verkapptes su ist, sondern sich gescheit und eben auch passwortlos für userb konfigurieren lässt.
r900 hat geschrieben:

Code: Alles auswählen

usera@host:~$ xhost +si:localuser:userb
localuser:userb being added to access control list
usera@host:~$ sudo -u userb xclock
Dann musst du nur sudo so konfigurieren dass usera Befehle als userb ausführen darf, eventuell auch ohne Passwortabfrage.
Bingo, das funktioniert auch. sudo -u userb xterm und gksudo funktionieren gleichermaßen mit dieser Einstellung. Ohne userb auf der ACL produziert das xterm im ersteren Fall eine (halbwegs) aussagekräftige Fehlermeldung, gksudo macht aber selbst die Grätsche und gibt Müll aus.

Und noch schöner, wenn man in der SSH-Sitzung bei zuvoriger xhost-Parametrierung DISPLAY auf :0 setzt und xclock startet, läuft es auch. Allerdings halte ich das für einen Spezialfall, da über SSH zwar der Befehl geht, aber dort der lokale localhost-X kontaktiert wird, was eben nicht über SSH zurück geht. Das passiert alles auf derselben Maschine, daher fällt das nicht weiter auf.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten