¿Cómo reenviar X sobre SSH para ejecutar aplicaciones gráficas de forma remota?


345

Tengo una máquina que ejecuta Ubuntu que utilizo SSH desde mi máquina Fedora 14. Quiero reenviar X desde la máquina Ubuntu a Fedora para poder ejecutar programas gráficos de forma remota. Ambas máquinas están en una LAN.

Sé que la -Xopción habilita el reenvío X11 en SSH, pero siento que me faltan algunos de los pasos.

¿Cuáles son los pasos necesarios para reenviar X desde una máquina Ubuntu a Fedora a través de SSH?


66
Sé que esto es bastante común, pero tengo problemas. Una respuesta definitiva para esta pregunta sería útil para muchos. Muchos ejemplos alrededor parecen omitir detalles importantes.
Sr. Shickadance

Respuestas:


413

El reenvío X11 debe habilitarse tanto en el lado del cliente como en el lado del servidor.

En el lado del cliente , la -Xopción (X mayúscula) sshhabilita el reenvío X11, y puede hacer que esto sea el predeterminado (para todas las conexiones o para una conexión específica) con ForwardX11 yesin ~/.ssh/config.

En el lado del servidor , X11Forwarding yesdebe especificarse en /etc/ssh/sshd_config. Tenga en cuenta que el valor predeterminado es sin reenvío (algunas distribuciones lo activan en su valor predeterminado /etc/ssh/sshd_config) y que el usuario no puede anular esta configuración.

El xauthprograma debe instalarse en el lado del servidor. Si hay algún programa X11 allí, es muy probable que xauthesté allí. En el caso poco probable de que xauthse haya instalado en una ubicación no estándar, se puede llamar a través de él ~/.ssh/rc(¡en el servidor!).

Tenga en cuenta que no necesita establecer ninguna variable de entorno en el servidor. DISPLAYy XAUTHORITYse establecerá automáticamente en sus valores adecuados. Si ejecuta ssh y DISPLAYno está configurado, significa que ssh no reenvía la conexión X11.

Para confirmar que ssh está reenviando X11, verifique si hay una línea contenida Requesting X11 forwardingen la ssh -v -Xsalida. Tenga en cuenta que el servidor no responderá de ninguna manera, una precaución de seguridad de ocultar detalles de posibles atacantes.


31
@usuario: No, nunca lo necesitas xhost +. xhostes de una era más suave cuando tener una máquina conectada a la red significaba que eras confiable. xhost +significa que cualquiera que pueda falsificar su IP puede tomar el control de su sesión de servidor X. ssh -Xconfigurará todas las autorizaciones requeridas. Si el reenvío X11 está deshabilitado en la configuración del servidor, hable con su administrador; si eso no funciona, consulte Reenvío X11 sobre SSH si la configuración del servidor no lo permite .
Gilles

66
Gracias por mencionar xauth! La falta de eso en un servidor básico me estaba causando problemas.
vasi

55
+1 para hacer la distinción entre ~/.ssh/configy /etc/ssh/sshd_configen el mismo lugar. No podría decir si eran archivos diferentes o simplemente un cambio en la nomenclatura.
puk

1
@ KhurshidAlam No importa si el servidor también está ejecutando un entorno GUI. Verifique los permisos en el .Xauthorityarchivo. Si usa Red Hat u otro sistema con SELinux, verifique el contexto de SELinux, consulte unix.stackexchange.com/questions/36540/…
Gilles

8
después de ssh -Xejecutar xterm &para obtener un terminal gráfico como la prueba definitiva para ver si está funcionando.
Alexander Taylor

88

Para que el reenvío X11 funcione sobre ssh, necesitará 3 cosas en su lugar.

  1. Su cliente debe estar configurado para reenviar X11.
  2. Su servidor debe estar configurado para permitir el reenvío X11.
  3. Su servidor debe poder configurar la autenticación X11.

Si tiene ambos # 1 y # 2 en su lugar pero le falta el # 3, entonces terminará con una variable de entorno DISPLAY vacía.

Sopa de nueces, así es cómo hacer que el reenvío X11 funcione.

  1. En su servidor, asegúrese de que / etc / ssh / sshd_config contenga:

    X11Forwarding yes
    X11DisplayOffset 10
    

    Es posible que necesite SIGHUP sshd para que recoja estos cambios.

    cat /var/run/sshd.pid | xargs kill -1
    
  2. En su servidor, asegúrese de tener instalado xauth.

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

    Si no tiene instalado xauth, se encontrará con el problema de "variable de entorno DISPLAY vacía".

  3. En su cliente, conéctese a su servidor. Asegúrese de decirle a ssh que permita el reenvío de X11. yo prefiero

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

pero te puede gustar

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

o puede configurar esto en su ~ / .ssh / config.


Me encontré con esta variable de entorno DISPLAY vacía el día de hoy cuando ingresé a un nuevo servidor que no administro. Rastrear la parte xauth que faltaba fue un poco divertido. Esto es lo que hice y lo que tú puedes hacer también.

En mi estación de trabajo local, donde soy administrador, verifiqué que / etc / ssh / sshd_config estaba configurado para reenviar X11. Cuando ssh -X vuelve a localhost, obtengo mi DISPLAY configurado correctamente.

Forzar que DISPLAY se desarmara no fue demasiado difícil. Solo necesitaba ver qué estaban haciendo sshd y ssh para configurarlo correctamente. Aquí está la salida completa de todo lo que hice en el camino.

    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

En lugar de usar sudo para forzar la copia de mis archivos ssh_host_ {dsa, rsa} _key en su lugar, utilicé ssh-keygen para crear archivos ficticios para mí.

    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.

Enjuague y repita con -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

Edite ~ / dummy-sshd / sshd_config para apuntar a los nuevos archivos de clave ssh_host correctos.

    # 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

Inicie sshd en un nuevo puerto en modo sin desconexión:

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

Vaya, mejor corrige ese camino:

    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 una nueva terminal y ssh en localhost en el puerto 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

Mira las últimas tres líneas allí. Afortunadamente tenía el conjunto DISPLAY, y tenía esas dos líneas bonitas de / usr / bin / xauth.

A partir de ahí, fue un juego de niños mover mi / usr / bin / xauth a /usr/bin/xauth.old, desconectarme de ssh y detener el sshd, luego lanzar sshd y ssh nuevamente en localhost.

Cuando / usr / bin / xauth desapareció, no vi DISPLAY reflejado en mi entorno.


No hay nada brillante pasando aquí. Principalmente tuve la suerte de elegir un enfoque sensato para intentar reproducir esto en mi máquina local.


1
Wow, muchas gracias por tu respuesta. Estaba haciendo todo bien excepto el export DISPLAY=:10. Nunca adiviné ese número de pantallas.
erm3nda

¡Es un desplazamiento de pantalla de 10! : D
41754

34

Asegúrate de eso:

  • Has xauthinstalado en el servidor (ver: xauth info/ xauth list).
  • En el servidor, su /etc/ssh/sshd_configarchivo tiene estas líneas:

    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost no
    
  • En el lado del cliente, su ~/.ssh/configarchivo tiene estas líneas:

    Host *
      ForwardAgent yes
      ForwardX11 yes
    
  • En el lado del cliente, tiene instalado el servidor X (por ejemplo, macOS: XQuartz; Windows: Xming).


Luego, para reenviar X11 usando SSH, debe agregar -Xa sussh comando, por ejemplo

ssh -v -X user@host

luego verifique que su noDISPLAY esté vacío:

echo $DISPLAY

Si es así, entonces teniendo un parámetro detallado para ssh ( -v), verifique cualquier advertencia, por ejemplo

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

En caso de que tenga X11 no confiable como se muestra arriba, intente -Ymarcar en su lugar (si confía en el host):

ssh -v -Y user@host

Consulte: ¿Qué significa "Advertencia: la configuración de reenvío de X11 no confiable no se realizó: no se generaron los datos de la clave xauth" cuando se ssh'ing con -X?


En caso de que advierta: No hay datos de xauth , puede intentar generar un nuevo .Xauthorityarchivo, por ejemplo

xauth generate :0 . trusted
xauth list

Ver: Crear / reconstruir un nuevo archivo .Xauthority


Si tiene advertencias diferentes a las anteriores, siga las pistas adicionales.



1
La guía definitiva: la configuración en el lado del cliente marcó la diferencia
user2928048

2
y X11UseLocalhost no en el lado del servidor
user2928048

17

La solución es agregar esta línea a su /etc/ssh/sshd_config:

X11UseLocalhost no

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


Tengo 2 servidores Ubuntu. En el que necesitaba que se estableciera en sí, en el otro tenía que ser no. Estoy seguro de que hay una explicación, pero vale la pena probar ambas.
alfonx

1
¡Esta solución funcionó para mí!
rigon

3
Por favor aclare si quiere poner esta configuración en el servidor o cliente
Klik

5

Permitir que Ubuntu bash en Windows 10 se ejecute ssh -X para obtener un entorno GUI en un servidor remoto

  • primero

Instale todo lo siguiente. En la ventana, instale Xming. En Ubuntu bash, use sudo apt installpara instalar ssh xauth xorg.

sudo apt install ssh xauth xorg
  • Segundo

Ir a la carpeta contiene el ssh_configarchivo, el mío es /etc/ssh.

  • Tercero

Editar ssh_configcomo administrador (USE sudo). En el interior ssh_config, retire el hash #en las líneas ForwardAgent, ForwardX11, ForwardX11Trusted, y establecer los argumentos correspondientes a yes.

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • Adelante

En el ssh_configarchivo, elimine el hash frontal #antes Port 22y Protocol 2, y también agregue una nueva línea al final del archivo para indicar la ubicación del archivo xauth XauthLocaion /usr/bin/xauth, recuerde escribir su propia ruta del archivo xauth.

# /etc/ssh/ssh_config

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

Ahora que hemos terminado de editar el ssh_configarchivo, guárdelo cuando salgamos del editor. Ahora vaya a la carpeta ~o $HOME, agregue export DISPLAY=localhost:0a su .bashrcarchivo y guárdelo.

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

Casi terminamos. Reinicia tu shell bash, abre tu Xmingprograma y úsalo ssh -X yourusername@yourhost. Entonces disfrute del entorno GUI.

ssh -X yourusername@yourhost

El problema también está en el subsistema Ubuntu en Windows, y el enlace está en

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


3

Añadir X11UseLocalhost noa /etc/ssh/sshd_configy reiniciar el servidor SSH.

Si no aparece DISPLAY, verifique si xauth está instalado correctamente y luego vuelva a intentarlo.

RHE / CEntos no tiene este problema, ¡esto es algo de Ubuntu!


1

Para mí, el problema estaba en la opción de montaje de nodev para el sistema de archivos / tmp. X11 necesita un archivo especial para crearse allí.

Por lo tanto, compruebe cuáles son las opciones de montaje para el sistema de archivos / tmp si utiliza una partición o disco separado para eso.


1
Creo que es posible que desee ver otras respuestas a la pregunta original y tomarse un momento para pensar cómo su propia respuesta las mejora.
Sami Laine

1

Para agregar a las excelentes respuestas anteriores (configuración ~/.ssh/configy verificación para ver si la DISPLAYvariable de entorno está configurada en el cliente, configuración /etc/ssh/sshd_confige instalación xauthen el servidor), también asegúrese de que xtermesté instalada en el cliente, por ejemplo

sudo apt-get install xterm

1

xauth Se puede bloquear.

   -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.

Utilizando

xauth -b

En la máquina en la que estaba tratando de sshromper la cerradura xauth. Salir de la sshsesión después de emitir y xauth -bluego volver a iniciar sesión finalmente me permitió con éxito echo $DISPLAY. Definitivamente intente esto antes de volver a crear.Xauthority


0

X11Forwardingdebe configurarse en el servidor SSH (en su caso, el cuadro de Ubuntu) en él sshd_config, y debe permitir que se reenvíe X11 para el cliente SSH (su cuadro de Fedora) pasando la -Xopción o editando el ssh_configarchivo para agregar el ForwardX11valor predeterminado.


1
También necesita xauthinstalarse en la máquina remota, de lo contrario, las cosas de autoridad x no funcionarán.
Faheem Mitha

¿Qué pasa con la configuración DISPLAY?
Sr. Shickadance

1
ssh se configurará automáticamente $DISPLAYsi X11Forwardingestá habilitado y xauthestá presente en el sistema cliente.
Shadur

1
@Shadur No es para mí. Funciona cuando yo export DISPLAY=:10.0pero no de otra manera. De lo contrario, se queja de que no puede encontrar :0. ¿Quizás se necesita algo más para que esto suceda automáticamente?
cfr
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.