¿Cómo ejecuto una aplicación gráfica en un servidor remoto cuando inicio sesión a través de SSH?

14

Estoy tratando de ejecutar geditdesde un terminal SSH en Windows, conectado a una instancia de Amazon EC2 que ejecuta Ubuntu 12.04 Server y obtengo este error:

Cannot open display:

¿Cómo lo soluciono?

Gaurav Agarwal
fuente

Respuestas:

14

Como está utilizando Windows de su lado, necesitará un cliente SSH que ejecute un servidor X local en Windows para ejecutar aplicaciones gráficas desde el servidor de forma remota en su pantalla.

Por experiencia, recomendaría el MobaXTerm gratuito que tiene esta funcionalidad incorporada. Descárgalo y pruébalo:

ingrese la descripción de la imagen aquí

Si obtiene algún error, es porque a veces una imagen mínima del servidor puede no estar configurada para permitir el reenvío de X en ella. En ese caso, comente y lo ayudaré a resolverlo; He hecho esto con muchos VPS mínimos que ejecutan Ubuntu / Debian.

ish
fuente
17

Entonces, ¿se está conectando desde la PC de su casa (llamémosla máquina ) a un servidor (llamémosla servidor ) a través de ssh ? ¿Desea iniciar un programa con una ventana gráfica en el servidor a través de su máquina? Si eso es correcto, siga leyendo.

Llamemos al programa para comenzar, geditpero el proceso es el mismo para todos. Dependiendo de dónde desee ver la ventana gráfica, salte al encabezado correcto.

Ventana en la pantalla de tu máquina

Si desea ver y usar la ventana de gedit en su máquina remota pero comienza en el servidor, querrá que su sesión de shell se vea así:

user@remote-machine:~$ ssh -X user@server
Last login: Tue Aug 14 13:47:04 2012 from clientXX
*******************************************************************************
M O T D (Message Of The Day)
*******************************************************************************
user@server:~$ gedit .bash_aliases 

** (gedit:7851): WARNING **: Could not load theme icon gtk-home: Icon 'gtk-home' not present in theme

(gedit:7851): Gtk-WARNING **: Attempting to store changes 

No se preocupe por las advertencias, son normales: la ventana gedit aparecerá en la pantalla de su máquina remota como se vería en el servidor. El truco consiste en utilizar la opción "-X", ya ssh -Xque habilita el túnel X y establece la DISPLAYvariable correctamente.

Esto supone que está utilizando un cliente SSH que admite X11 y que su servidor tiene un servidor X en ejecución (algunos sin necesidad de GUI no ejecutan un servidor X). Especialmente en Windows, esto podría ser un problema, ya que la mayoría de los programas de terminal de Windows no tienen X. Como izx afirmó, MobaXTerm es uno de los muchos clientes SSH para Windows que tiene un X-Server.

Sin embargo, para un servidor que carece de X11, tendría que instalarlo.

En la pantalla del servidor

También puede iniciar una instancia en la pantalla de su servidor llamando a gedit de esta manera:

ssh user@server
DISPLAY=:0.0 gedit

Debe sustituir el valor correcto en lugar de hacerlo :0.0para obtenerlo en la pantalla X correcta (solo es importante si hay varias pantallas conectadas a su servidor o si es algo peculiar en su configuración).

Aquí, el escenario más común para que eso no funcione sería si el Servidor careciera de un Servidor X11 pero no tendría un monitor conectado o no tuviera una interfaz gráfica de usuario y no estaría leyendo esto: D.

Un poco de teoría

No soy un experto en esto, pero la forma en que creo que funciona es que cada pantalla física, es decir, cada monitor conectado a una computadora individual obtiene un número en forma de 0.0` 1.0` 2.0, ...

Este número es asignado por el X-Window-System, también conocido como X11. Esa es una capa para proporcionar una red y una interfaz gráfica básica sobre la cual Unity, Gnome, KDE y similares pueden construir.

Puede ver cuántas pantallas tiene una máquina determinada y qué números están en uso ejecutando for x in /tmp/.X11-unix/X*; do echo ":${x##*X}"; doneen la máquina en cuestión. * Luego, cada computadora que está configurada para hacer que sus pantallas estén disponibles y ejecuta un servidor X tiene un nombre de host. Puede usar pantallas de hosts desde cualquier máquina en la misma red configurando su DISPLAYvariable de acuerdo a DISPLAY=hostname:0.0. Ssh hace esto por usted de manera sensata si proporciona la -Xopción.

* Nota: supongo que hay una mejor manera que este for-loop.

Si todo lo demás falla

Use un editor de texto de shell. vi, vim, nanoY emacsson los más comunes y por lo menos uno de ellos será instalado y operativo. De ellos nanoes el más fácil y más explicativo.

confundir
fuente
@coding crow: si eres SSHing de Windows, depende del cliente si eso funcionará o no. Algunos clientes no se comunican con X11 y, por lo tanto, no envían X, aunque para algunos funciona bien. Si no funciona, cambie el cliente SSH para Windows o use nano, vim o emacs como xyious sugirió en su respuesta.
con-f-use
Sí, obtuve un voto negativo, lo vi en mi perfil y me pregunté por qué no hay comentarios ni nada. No tan importante no tenía que ver contigo, solo me preguntaba: me alegro de que tu problema esté resuelto y podría ser de ayuda aquí.
con-f-use
He modificado el forbucle un poco ... ahora solo mostrará la dirección de pantalla, por ejemplo :0 :0.0. Siéntete libre de volver si crees que no es lo que quieres ...
heemayl
0

Lo que dijo con-f-use .

Básicamente tienes una terminal a través de SSH y Gedit es un programa GUI. La respuesta de con-f-use hará que funcione desde una sesión de cliente GUI de Linux.

La otra opción sería usar un editor que no sea GUI como nano, Vi u muchos otros.

xyious
fuente