Wie leite ich X über SSH weiter, um Grafikanwendungen aus der Ferne auszuführen?

342

Ich habe eine Maschine mit Ubuntu, auf die ich von meiner Fedora 14-Maschine aus SSH-fähig bin. Ich möchte X vom Ubuntu-Rechner zurück an Fedora senden, damit ich grafische Programme remote ausführen kann. Beide Maschinen befinden sich in einem LAN.

Ich weiß, dass die -XOption die X11-Weiterleitung in SSH aktiviert, aber ich habe das Gefühl, dass mir einige Schritte fehlen.

Was sind die erforderlichen Schritte, um X von einem Ubuntu-Computer über SSH an Fedora weiterzuleiten?

Mr. Shickadance
quelle
6
Ich weiß, dass das ziemlich häufig ist, aber ich habe Probleme. Eine endgültige Antwort auf diese Frage wäre für viele hilfreich. Viele Beispiele scheinen wichtige Details auszulassen.
Mr. Shickadance

Antworten:

411

Die X11-Weiterleitung muss sowohl auf der Client- als auch auf der Serverseite aktiviert sein.

Auf der Clientseite die -XOption ssh(großes X), um die X11-Weiterleitung zu aktivieren, und Sie können dies als Standard (für alle Verbindungen oder für eine bestimmte Verbindung) mit ForwardX11 yesin festlegen ~/.ssh/config.

Auf der Server - Seite , X11Forwarding yesmuss angegeben in /etc/ssh/sshd_config. Beachten Sie, dass die Standardeinstellung keine Weiterleitung ist (einige Distributionen aktivieren sie standardmäßig /etc/ssh/sshd_config) und dass der Benutzer diese Einstellung nicht überschreiben kann.

Das xauthProgramm muss serverseitig installiert sein. Wenn dort X11-Programme vorhanden sind, ist es sehr wahrscheinlich, dass xauthdiese vorhanden sind. In dem unwahrscheinlichen Fall, dass xauthes an einem nicht standardmäßigen Ort installiert wurde, kann es aufgerufen werden ~/.ssh/rc(auf dem Server!).

Beachten Sie, dass Sie keine Umgebungsvariablen auf dem Server festlegen müssen. DISPLAYund XAUTHORITYwerden automatisch auf die richtigen Werte gesetzt. Wenn Sie ssh ausführen und DISPLAYnicht festgelegt sind, bedeutet dies, dass ssh die X11-Verbindung nicht weiterleitet.

Um zu bestätigen, dass ssh X11 weiterleitet, prüfen Sie, ob eine Zeile Requesting X11 forwardingin der ssh -v -XAusgabe enthalten ist. Beachten Sie, dass der Server in keiner Weise antwortet. Dies ist eine Sicherheitsmaßnahme, um potenziellen Angreifern Details zu verbergen.

Gilles
quelle
31
@user: Nein, das brauchst du nie xhost +. xhoststammt aus einer sanfteren Zeit, in der ein an das Netzwerk angeschlossener Computer bedeutet, dass Sie vertrauenswürdig sind. xhost +bedeutet, dass jeder, der Ihre IP fälschen kann, die Kontrolle über Ihre X-Serversitzung übernehmen kann. ssh -Xrichtet alle erforderlichen Berechtigungen ein. Wenn die X11-Weiterleitung in der Serverkonfiguration deaktiviert ist, wenden Sie sich an Ihren Administrator. Wenn dies nicht funktioniert, lesen Sie X11 über SSH weiterleiten, wenn die Serverkonfiguration dies nicht zulässt .
Gilles
6
Danke, dass du xauth erwähnt hast! Das Fehlen eines Barebones-Servers bereitete mir Probleme.
Vasi
5
+1 für die Unterscheidung zwischen ~/.ssh/configund /etc/ssh/sshd_configan derselben Stelle. Ich konnte nicht sagen, ob es sich um unterschiedliche Dateien oder nur um eine Änderung der Nomenklatur handelte.
Puk
1
@ KhurshidAlam Es spielt keine Rolle, ob auf dem Server auch eine GUI-Umgebung ausgeführt wird. Überprüfen Sie die Berechtigungen für die .XauthorityDatei. Wenn Sie Red Hat oder ein anderes System mit SELinux verwenden, überprüfen Sie den SELinux-Kontext unter unix.stackexchange.com/questions/36540/…
Gilles
8
Nach dem ssh -XStart xterm &erhalten Sie ein grafisches Terminal als ultimativen Test, um zu prüfen, ob es funktioniert.
Alexander Taylor
87

Damit die X11-Weiterleitung über ssh funktioniert, sind drei Dinge erforderlich.

  1. Ihr Client muss so eingerichtet sein, dass er X11 weiterleitet.
  2. Ihr Server muss so eingerichtet sein, dass X11-Weiterleitungen möglich sind.
  3. Ihr Server muss in der Lage sein, die X11-Authentifizierung einzurichten.

Wenn Sie sowohl # 1 als auch # 2 haben, aber # 3 fehlen, erhalten Sie eine leere Umgebungsvariable DISPLAY.

Suppe-zu-Nuss, hier erfahren Sie, wie Sie die Weiterleitung von X11 zum Laufen bringen.

  1. Stellen Sie auf Ihrem Server sicher, dass / etc / ssh / sshd_config Folgendes enthält:

    X11Forwarding yes
    X11DisplayOffset 10
    

    Möglicherweise müssen Sie sshd SIGHUPEN, damit diese Änderungen übernommen werden.

    cat /var/run/sshd.pid | xargs kill -1
    
  2. Stellen Sie sicher, dass auf Ihrem Server xauth installiert ist.

    belden@skretting:~$ which xauth
    /usr/bin/xauth
    

    Wenn Sie xauth nicht installiert haben, tritt das Problem "Leere DISPLAY-Umgebungsvariable" auf.

  3. Stellen Sie auf Ihrem Client eine Verbindung zu Ihrem Server her. Vergewissern Sie sich, dass ssh die Weiterleitung von X11 zulässt. ich bevorzuge

    belden@skretting:~$ ssh -X blyman@the-server
    

aber du magst vielleicht

    belden@skretting:~$ ssh -o ForwardX11=yes blyman@the-server

oder Sie können dies in Ihrer ~ / .ssh / config einrichten.


Ich bin heute auf diese leere DISPLAY-Umgebungsvariable gestoßen, als ich auf einen neuen Server zugegriffen habe, den ich nicht verwalte. Das Aufspüren des fehlenden xauth-Teils hat ein bisschen Spaß gemacht. Hier ist, was ich getan habe und was Sie auch tun können.

Auf meiner lokalen Workstation, auf der ich Administrator bin, habe ich überprüft, ob / etc / ssh / sshd_config für die Weiterleitung von X11 eingerichtet wurde. Wenn ich -X wieder in localhost einsetze, wird mein DISPLAY korrekt eingestellt.

Es war nicht allzu schwer, DISPLAY zu zwingen, sich zu entfernen. Ich musste nur beobachten, was sshd und ssh taten, um es richtig einzustellen. Hier ist die vollständige Ausgabe von allem, was ich unterwegs getan habe.

    blyman@skretting:~$ mkdir ~/dummy-sshd
    blyman@skretting:~$ cp -r /etc/ssh/* ~/dummy-sshd/
    cp: cannot open `/etc/ssh/ssh_host_dsa_key' for reading: Permission denied
    cp: cannot open `/etc/ssh/ssh_host_rsa_key' for reading: Permission denied

Anstatt sudo zu verwenden, um das Kopieren meiner ssh_host_ {dsa, rsa} _key-Dateien zu erzwingen, habe ich ssh-keygen verwendet, um für mich selbst Dummy-Dateien zu erstellen.

    blyman@skretting:~$ ssh-keygen -t rsa -f ~/dummy-sshd/ssh_host_rsa_key
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/blyman/dummy-sshd/ssh_host_rsa_key.
    Your public key has been saved in /home/blyman/dummy-sshd/ssh_host_rsa_key.pub.

Spülen und wiederholen mit -t dsa:

    blyman@skretting:~$ ssh-keygen -t dsa -f ~/dummy-sshd/ssh_host_dsa_key
    # I bet you can visually copy-paste the above output down here

Bearbeiten Sie ~ / dummy-sshd / sshd_config, um auf die richtigen neuen ssh_host-Schlüsseldateien zu verweisen.

    # before
    blyman@skretting:~$ grep ssh_host /home/blyman/dummy-sshd/sshd_config 
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_dsa_key

    # after
    blyman@skretting:~$ grep ssh_host /home/blyman/dummy-sshd/sshd_config 
    HostKey /home/blyman/dummy-sshd/ssh_host_rsa_key
    HostKey /home/blyman/dummy-sshd/ssh_host_dsa_key

Starten Sie sshd an einem neuen Port im nicht getrennten Modus:

    blyman@skretting:~$ sshd -p 50505 -f ~/dummy-sshd/sshd_config -d
    sshd re-exec requires execution with an absolute path

Ups, korrigiere diesen Pfad besser:

    blyman@skretting:~$ /usr/sbin/sshd -p 50505 -f ~/dummy-sshd/sshd_config -d
    debug1: sshd version OpenSSH_5.5p1 Debian-4ubuntu6
    debug1: read PEM private key done: type RSA
    debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
    debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
    debug1: private host key: #0 type 1 RSA
    debug1: read PEM private key done: type DSA
    debug1: Checking blacklist file /usr/share/ssh/blacklist.DSA-1024
    debug1: Checking blacklist file /etc/ssh/blacklist.DSA-1024
    debug1: private host key: #1 type 2 DSA
    debug1: setgroups() failed: Operation not permitted
    debug1: rexec_argv[0]='/usr/sbin/sshd'
    debug1: rexec_argv[1]='-p'
    debug1: rexec_argv[2]='50505'
    debug1: rexec_argv[3]='-f'
    debug1: rexec_argv[4]='/home/blyman/dummy-sshd/sshd_config'
    debug1: rexec_argv[5]='-d'
    Set /proc/self/oom_adj from 0 to -17
    debug1: Bind to port 50505 on 0.0.0.0.
    Server listening on 0.0.0.0 port 50505.
    debug1: Bind to port 50505 on ::.
    Server listening on :: port 50505.

Pop ein neues Terminal und ssh in localhost auf Port 50505:

    blyman@skretting:~$ ssh -p 50505 localhost
    The authenticity of host '[localhost]:50505 ([::1]:50505)' can't be established.
    RSA key fingerprint is 81:36:a5:ff:a3:5a:45:a6:90:d3:cc:54:6b:52:d0:61.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[localhost]:50505' (RSA) to the list of known hosts.
    Linux skretting 2.6.35-32-generic #67-Ubuntu SMP Mon Mar 5 19:39:49 UTC 2012 x86_64 GNU/Linux
    Ubuntu 10.10

    Welcome to Ubuntu!
     * Documentation:  https://help.ubuntu.com/

    1 package can be updated.
    0 updates are security updates.

    Last login: Thu Aug 16 15:41:58 2012 from 10.0.65.153
    Environment:
      LANG=en_US.UTF-8
      USER=blyman
      LOGNAME=blyman
      HOME=/home/blyman
      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
      MAIL=/var/mail/blyman
      SHELL=/bin/bash
      SSH_CLIENT=::1 43599 50505
      SSH_CONNECTION=::1 43599 ::1 50505
      SSH_TTY=/dev/pts/16
      TERM=xterm
      DISPLAY=localhost:10.0
    Running /usr/bin/xauth remove unix:10.0
    /usr/bin/xauth add unix:10.0 MIT-MAGIC-COOKIE-1 79aa9275ced418dd445d9798b115d393

Schauen Sie sich die letzten drei Zeilen an. Ich hatte zufällig DISPLAY gesetzt und hatte diese zwei gut aussehenden Zeilen aus / usr / bin / xauth.

Von dort aus war es ein Kinderspiel, mein / usr / bin / xauth nach /usr/bin/xauth.old zu verschieben, die Verbindung zu ssh zu trennen und das sshd anzuhalten und dann sshd und ssh wieder in localhost zu starten.

Als / usr / bin / xauth nicht mehr vorhanden war, wurde DISPLAY in meiner Umgebung nicht angezeigt.


Hier ist nichts Geniales los. Meistens hatte ich das Glück, einen vernünftigen Ansatz zu wählen, um dies auf meinem lokalen Computer zu reproduzieren.

Belden
quelle
1
Wow, vielen Dank für Ihre Antwort. Ich habe alles gut gemacht, bis auf die export DISPLAY=:10. Ich habe die Anzahl der Displays nie erraten.
erm3nda
Es ist ein Anzeigeversatz von 10! : D
41754
33

Stelle sicher das:

  • Sie haben xauthauf dem Server installiert (siehe: xauth info/ xauth list).
  • Auf dem Server hat Ihre /etc/ssh/sshd_configDatei folgende Zeilen:

    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost no
    
  • Auf der Clientseite hat Ihre ~/.ssh/configDatei folgende Zeilen:

    Host *
      ForwardAgent yes
      ForwardX11 yes
    
  • Auf der Clientseite haben Sie X-Server installiert (z. B. macOS: XQuartz; Windows: Xming).


Um dann eine X11-Weiterleitung mit SSH durchzuführen, müssen Sie Ihren Befehl ergänzen-Xssh , z

ssh -v -X user@host

stellen Sie sicher , dass Ihr DISPLAYist nicht durch leer:

echo $DISPLAY

Wenn dies der Fall ist -v, überprüfen Sie den ausführlichen Parameter für ssh ( ) auf etwaige Warnungen, z

debug1: No xauth program.
Warning: untrusted X11 forwarding setup failed: xauth key data not generated

Im Fall haben Sie , nicht vertrauenswürdigen X11 , wie oben gezeigt, dann versuchen -YFlagge statt (wenn Sie den Host vertrauen):

ssh -v -Y user@host

Siehe: Was bedeutet "Warnung: Setup der nicht vertrauenswürdigen X11-Weiterleitung fehlgeschlagen: xauth-Schlüsseldaten wurden nicht generiert", wenn mit -X gesendet wird?


Falls Sie gewarnt haben: Keine xauth-Daten , können Sie versuchen, eine neue .XauthorityDatei zu generieren , z

xauth generate :0 . trusted
xauth list

Siehe: Erstellen / Neuerstellen einer neuen .Xauthority-Datei


Wenn Sie andere Warnungen als oben erhalten haben, befolgen Sie die weiteren Hinweise.


Kenorb
quelle
1
Der definitive Leitfaden: Die Konfiguration auf der Client-Seite kennzeichnete den Unterschied
user2928048
2
und X11UseLocalhost Nr. auf der Serverseite
Benutzer2928048
17

Das Update besteht darin, diese Zeile zu Ihrem hinzuzufügen /etc/ssh/sshd_config:

X11UseLocalhost no

https://joshua.hoblitt.com/rtfm/2013/04/how_to_fix_x11_forwarding_request_failed_on_channel_0/

As
quelle
Ich habe 2 Ubuntu-Server. Zum einen musste es auf Ja gesetzt werden, zum anderen musste es Nein sein. Ich bin mir sicher, dass es eine Erklärung gibt, aber es lohnt sich, beides zu versuchen.
Alfonx
1
Dieser Fix hat bei mir funktioniert !!
Rigon
3
Bitte klären Sie, ob Sie diese Einstellung auf dem Server oder Client
speichern
5

Ubuntu unter Windows 10 starten lassen ssh -X , um eine GUI-Umgebung auf einem Remote-Server zu erhalten

  • Zuerst

Installieren Sie alle folgenden. Installieren Sie unter Windows Xming. Unter Ubuntu Bash sudo apt installzum Installieren verwenden ssh xauth xorg.

sudo apt install ssh xauth xorg
  • Zweite

Gehe in den Ordner mit der ssh_configDatei, meine ist /etc/ssh.

  • Dritte

ssh_configAls Administrator bearbeiten (USE sudo). Innen ssh_config, entfernen Sie den Hash #in den Leitungen ForwardAgent, ForwardX11, ForwardX11Trusted, und , um die entsprechenden Argumente gesetzt yes.

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • Forth

In ssh_configDatei, entfernen Sie die Front Hash #vor Port 22und Protocol 2, und auch eine neue Zeile am Ende der Datei fügen Sie die xauth Speicherort der Datei angeben, XauthLocaion /usr/bin/xautherinnern Sie Ihren eigenen Weg der xauth - Datei schreiben.

# /etc/ssh/ssh_config

#   IdentifyFile ...
    Port 22
    Protocol 2
#   Cipher 3des
#   ...
#   ...
    ...
    ...
    GSSAPIDelegateCredentials no
    XauthLocaion /usr/bin/xauth
  • Fünfte

ssh_configNachdem wir die Bearbeitung der Datei abgeschlossen haben, speichern Sie diese, wenn Sie den Editor verlassen. Gehe nun in den Ordner ~oder $HOMEhänge export DISPLAY=localhost:0an deine .bashrcDatei an und speichere sie.

# ~/.bashrc
...
...
export DISPLAY=localhost:0
  • Zuletzt

Wir sind fast fertig. Starten Sie Ihre Bash-Shell neu, öffnen Sie Ihr XmingProgramm und verwenden Sie ssh -X yourusername@yourhost. Dann genießen Sie die GUI-Umgebung.

ssh -X yourusername@yourhost

Das Problem liegt auch im Ubuntu-Subsystem unter Windows, und der Link ist bei

https://gist.github.com/DestinyOne/f236f71b9cdecd349507dfe90ebae776

DestinyOne
quelle
3

Hinzufügen X11UseLocalhost nozu /etc/ssh/sshd_configund den SSH - Server neu starten.

Wenn Sie kein DISPLAY erhalten, überprüfen Sie, ob xauth korrekt installiert ist, und versuchen Sie es erneut.

RHE / CEntos hat dieses Problem nicht, dies ist eine Ubuntu-Sache!

Stephen Cooke
quelle
1

Für mich war das Problem in Nodev Mount Option für / tmp Dateisystem. In X11 muss eine spezielle Datei erstellt werden.

Überprüfen Sie daher, welche Mount-Optionen für das Dateisystem / tmp verfügbar sind, wenn Sie dafür eine separate Partition oder Festplatte verwenden.

Jakowpol
quelle
1
Ich denke, Sie möchten vielleicht andere Antworten auf die ursprüngliche Frage sehen und einen Moment darüber nachdenken, wie sich Ihre eigene Antwort auf diese verbessert.
Sami Laine
1

Um die vorherigen ausgezeichneten Antworten zu ergänzen (Einrichten ~/.ssh/configund Überprüfen, ob die DISPLAYUmgebungsvariable auf dem Client eingestellt ist, Einrichten /etc/ssh/sshd_configund Installieren xauthauf dem Server), stellen Sie auch sicher, dass xtermauf dem Client installiert ist, z

sudo apt-get install xterm
Aliz Rao
quelle
1

xauth kann gesperrt werden.

   -b      This  option  indicates  that  xauth  should  attempt to break any authority file locks before proceeding.  Use this
           option only to clean up stale locks.

Verwenden

xauth -b

An der Maschine, in die ich hineingehen wollte, sshbrach das Schloss auf xauth. Das Abmelden von der sshSitzung nach dem Ausstellen und xauth -banschließenden erneuten Anmelden ermöglichte es mir schließlich, mich erfolgreich abzumelden echo $DISPLAY. Versuchen Sie dies auf jeden Fall, bevor Sie neu erstellen.Xauthority

Barton Chittenden
quelle
0

X11Forwardingmuss auf dem SSH-Server (in Ihrem Fall der Ubuntu-Box) eingestellt sein sshd_config, und Sie müssen X11 für den SSH-Client (Ihre Fedora-Box) weiterleiten lassen, indem Sie die -XOption übergeben oder die ssh_configDatei bearbeiten , um den ForwardX11Standard hinzuzufügen .

Caleb
quelle
1
Sie müssen auch xauthauf dem Remotecomputer installiert sein, andernfalls funktioniert das X-Authority-Zeug nicht.
Faheem Mitha
Was ist mit Einstellung DISPLAY?
Mr. Shickadance
1
ssh wird automatisch gesetzt, $DISPLAYwenn X11Forwardinges aktiviert ist und xauthauf dem Client-System vorhanden ist.
Shadur
1
@Shadur Nicht für mich. Es funktioniert bei mir export DISPLAY=:10.0aber nicht anders. Ansonsten beschwert es sich, dass es nicht finden kann :0. Vielleicht ist noch etwas anderes nötig, damit dies automatisch geschieht?
cfr