Como executo um aplicativo gráfico em um servidor remoto quando conectado através do SSH?

14

Estou tentando executar a geditpartir 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?

Gaurav Agarwal
fonte

Respostas:

14

Como você está usando o Windows do seu lado, 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 tem essa funcionalidade embutida. Faça o download e experimente:

insira a descrição da imagem aqui

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

ish
fonte
17

Então você está se conectando do seu PC doméstico (vamos chamá-lo de sua máquina ) a um servidor (vamos chamá-lo de servidor ) via ssh ? Deseja iniciar um programa com uma janela gráfica no servidor via sua máquina? Se isso estiver correto, continue lendo.

Vamos chamar o programa para começar, geditmas o processo é o mesmo para todos. Dependendo de onde você deseja ver a janela gráfica, pule para o cabeçalho direito.

Janela na tela do seu equipamento

Se você deseja ver e usar a janela do gedit na sua máquina remota, mas iniciar no servidor, sua sessão do shell deve ficar 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 importe com os avisos, eles são normais - a janela do gedit aparecerá na tela da sua máquina remota, como seria no servidor. O truque é usar a opção "-X" como na ssh -Xqual habilita o tunelamento X e ajusta a DISPLAYvariável à direita.

Isso pressupõe que você esteja usando um cliente SSH compatível com X11 e que seu servidor tenha um servidor X em execução (alguns sem a necessidade de GUIs não executam um servidor X). Especialmente no Windows, isso pode ser um problema, pois a maioria dos programas de terminal do Windows não possui X. Como a izx afirmou, o MobaXTerm é um dos muitos clientes SSH para Windows que possui um X-Server.

No entanto, para um servidor sem o X11, é necessário 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ê precisa substituir o valor correto em vez de :0.0colocá-lo na tela X correta (importante apenas 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 isso não funcionar seria se o servidor não possuísse um servidor X11, mas não tivesse um monitor conectado a ele ou nenhuma interface gráfica do usuário e você não estivesse lendo isso: D.

Um pouco de teoria

Não sou especialista nisso, mas a maneira que eu acho que funciona é que cada tela física, ou seja, cada monitor conectado a um computador individual recebe um número de 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 Unity, Gnome, 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}"; donena máquina em questão. * Em seguida, cada computador configurado para disponibilizar suas telas e executar um servidor X possui um nome de host. Você pode usar telas de hosts de qualquer máquina na mesma rede, configurando sua DISPLAYvariável de acordo com DISPLAY=hostname:0.0. O Ssh faz isso por você de maneira sensata, se você fornecer a -Xopção.

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

Se todo o resto falhar

Use um editor de texto do shell. vi, vim, nanoE emacssão a mais comum e, pelo menos, um deles vai ser instalado e operacional. Deles nanoé o mais fácil e mais auto-explicativo.

confundir
fonte
@coding crow: Se você está usando SSH no Windows, depende do cliente se isso irá ou não funcionar. Alguns clientes não se comunicam com o X11 e, portanto, sem o encaminhamento de X - para alguns, embora funcione bem. Se não estiver funcionando, altere o cliente SSH para Windows ou use nano, vim ou emacs, conforme xyious sugerido em sua resposta.
con-f-use
Sim, recebi uma votação negativa, vi no meu perfil e me perguntei por que não havia nenhum comentário ou qualquer coisa. Não tão importante não tinha a ver com você, apenas me perguntei - feliz que seu problema esteja resolvido e que eu poderia ajudar aqui.
con-f-use
Eu modifiquei o forloop um pouco ... agora ele mostrará apenas o endereço de exibição, por exemplo :0 :0.0. Sinta-se livre para voltar, se você acha que não é o que você quer ..
heemayl
0

O que o 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 o fará funcionar a partir de uma sessão do cliente Linux GUI.

A outra opção seria usar um editor que não seja da GUI, como o nano, o Vi ou vários outros.

xyious
fonte