Como eu executo uma aplicação gráfica em um servidor remoto quando logado através do SSH?

14

Estou tentando executar gedit de um terminal SSH no Windows, conectado a uma instância do Amazon EC2 executando o Ubuntu 12.04 Server e estou recebendo este erro:

Cannot open display:

Como faço para corrigir isso?

    
por Gaurav Agarwal 14.08.2012 / 13:41

3 respostas

14

Como você está usando o Windows do seu lado, você precisará de um cliente SSH que execute um servidor X local no Windows para executar aplicativos gráficos do servidor remotamente na tela.

Por experiência, eu recomendaria o MobaXTerm gratuito que possui essa funcionalidade integrada. Faça o download e experimente:

Se você receber algum erro, isso ocorre porque às vezes uma imagem mínima do servidor pode não ser configurada para permitir o encaminhamento de X para ele. Nesse caso, por favor, comente e eu ajudarei você a resolvê-lo; Eu fiz isso com muitos VPSs mínimos rodando Ubuntu / Debian.

    
por ish 14.08.2012 / 14:19
17

Então você está se conectando a partir do seu pc de casa (vamos chamar sua máquina ) para um servidor (vamos chamá-lo de servidor ) via ssh ? Você quer iniciar um programa com uma janela gráfica no servidor através de sua máquina? Se isso estiver correto, então continue lendo.

Vamos chamar o programa para iniciar gedit , mas o processo é o mesmo para todos. Dependendo de onde você deseja ver a janela gráfica, pule para a direção correta.

Janela na tela da sua máquina

Se você quiser ver e usar a janela do gedit em sua máquina remota, mas iniciar no servidor, você desejará que sua sessão do shell fique assim:

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 

Não se preocupe com os avisos, eles são normais - a janela do gedit irá aparecer na tela da sua máquina remota como seria no servidor. O truque é usar a opção "-X" como em ssh -X , que permite o tunelamento X e define a variável DISPLAY .

Isso pressupõe que você esteja usando um cliente SSH que suporte o X11 e que seu servidor tenha um X-server em execução (alguns sem a necessidade de GUIs não executarem um X-server). Especialmente no Windows, isso pode ser um problema, já que a maioria dos programas terminais do Windows não tem X. Como izx declarou o O MobaXTerm é um dos muitos clientes SSH para Windows que possui um X-Server.

Para um servidor sem o X11, você deve instalá-lo.

Na tela do servidor

Você também pode iniciar uma instância na tela do seu servidor chamando gedit assim:

ssh user@server
DISPLAY=:0.0 gedit

Você tem que substituir o valor correto em vez de :0.0 para obtê-lo na tela X direita (só é importante se várias telas estiverem conectadas ao seu servidor ou se for algo peculiar em sua configuração).

Aqui, o cenário mais comum para que isso não funcione seria se o servidor não tivesse um X11-Server, mas não tivesse um monitor conectado a ele ou não tivesse uma interface gráfica com o usuário e você não estivesse lendo isto: D.

Um pouco de teoria

Não sou especialista nisso, mas a maneira como penso que funciona é que cada tela física, ou seja, cada monitor conectado a um computador individual recebe um número em execução na forma de 0.0 , 1.0 , 2.0 , ...

Este número é atribuído pelo X-Window-System, também conhecido como X11. Essa é uma camada para fornecer uma rede e uma interface gráfica básica que o Unity, o Gnome, o KDE e similares podem construir.

Você pode ver quantos monitores uma determinada máquina possui e quais números estão em uso executando for x in /tmp/.X11-unix/X*; do echo ":${x##*X}"; done na máquina em questão. * Então, cada computador configurado para disponibilizar suas telas e executar um servidor X tem um nome de host . Você pode usar telas de hosts de qualquer máquina na mesma rede definindo sua variável DISPLAY de acordo com DISPLAY=hostname:0.0 . O Ssh faz isso para você de uma maneira sensata, se você fornecer a opção -X .

* Nota: Suponho que exista uma maneira melhor do que este for-loop.

Se tudo mais falhar

Use um editor de texto shell. vi , vim , nano e emacs são os mais comuns e pelo menos um deles será instalado e operacional. Deles nano é o mais fácil e mais auto-explicativo.

    
por con-f-use 14.08.2012 / 13:50
0

O que con-f-use disse .

Basicamente você tem um terminal através do SSH e o Gedit é um programa GUI. A resposta do con-f-use fará com que funcione a partir de uma sessão do cliente Linux GUI.

A outra opção seria usar um editor sem interface gráfica como nano, Vi ou muitos outros.

    
por xyious 14.08.2012 / 14:01

Tags