Comment exécuter une application graphique sur un serveur distant lorsque je suis connecté via SSH?

14

J'essaie d'exécuter à geditpartir d'un terminal SSH sous Windows, connecté à une instance Amazon EC2 exécutant Ubuntu 12.04 Server et j'obtiens cette erreur:

Cannot open display:

Comment je le répare?

Gaurav Agarwal
la source

Réponses:

14

Puisque vous utilisez Windows de votre côté, vous aurez besoin d'un client SSH qui exécute un serveur X local sur Windows pour exécuter des applications graphiques à partir du serveur à distance sur votre écran.

Par expérience, je recommanderais le MobaXTerm gratuit qui a cette fonctionnalité intégrée. Veuillez le télécharger et l'essayer:

entrez la description de l'image ici

Si vous obtenez des erreurs, c'est parce que parfois une image de serveur minimale peut ne pas être configurée pour permettre le transfert X dans celle-ci. Dans ce cas, veuillez commenter et je vous aiderai à le résoudre; J'ai fait cela avec beaucoup de VPS minimaux exécutant Ubuntu / Debian.

ish
la source
17

Vous vous connectez donc depuis votre ordinateur personnel (appelons-le votre machine ) à un serveur (appelons-le serveur ) via ssh ? Vous souhaitez démarrer un programme avec une fenêtre graphique sur le serveur via votre machine? Si c'est correct que par tous les moyens, lisez la suite.

Appelons le programme pour démarrer geditmais le processus est le même pour tous. Selon l'endroit où vous voulez voir la fenêtre graphique, passez à la droite.

Fenêtre sur l'écran de votre machine

Si vous voulez voir et utiliser la fenêtre de gedit sur votre machine distante mais démarrer sur le serveur, vous voudrez que votre session shell ressemble à ceci:

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 

Ne vous occupez pas des avertissements, ils sont normaux - la fenêtre gedit apparaîtra sur l'écran de votre machine distante comme sur le serveur. L'astuce consiste à utiliser l'option "-X" comme pour ssh -Xactiver le tunneling X et définir la DISPLAYvariable à droite.

Cela suppose que vous utilisez un client SSH qui prend en charge X11 et que votre serveur dispose d'un serveur X en cours d'exécution (certains sans besoin d'interfaces graphiques n'exécutent pas de serveur X). Surtout sur Windows, cela pourrait être un problème car la plupart des programmes de terminaux Windows n'ont pas de X. Comme l' a déclaré izx , le MobaXTerm est l'un des nombreux clients SSH pour Windows qui a un X-Server.

Cependant, pour un serveur sans X11, vous devrez l'installer.

Sur l'écran du serveur

Vous pouvez également démarrer une instance sur l'écran de votre serveur en appelant gedit comme ceci:

ssh user@server
DISPLAY=:0.0 gedit

Vous devez remplacer la bonne valeur au lieu de :0.0bien pour l'obtenir sur le bon écran X (seulement important si plusieurs écrans sont connectés à votre serveur ou si c'est quelque peu particulier dans sa configuration).

Ici, le scénario le plus courant pour que cela ne fonctionne pas serait si le serveur manquait d'un serveur X11 mais qu'il n'avait pas de moniteur connecté ou n'avait pas d'interface utilisateur graphique et que vous ne liriez pas ceci: D.

Un peu de théorie

Je ne suis pas expert dans ce domaine , mais la façon dont je pense que cela fonctionne est que chaque écran physique, à savoir chaque moniteur connecté à un ordinateur individuel obtient un numéro en cours d' exécution sous forme de 0.0, 1.0, 2.0, ...

Ce numéro est attribué par le X-Window-System alias X11. C'est une couche pour fournir un réseau et une interface graphique de base sur lesquels Unity, Gnome, KDE et similaires peuvent s'appuyer.

Vous pouvez voir le nombre d'affichages d'une machine donnée et les nombres utilisés en exécutant for x in /tmp/.X11-unix/X*; do echo ":${x##*X}"; donesur la machine en question. * Ensuite, chaque ordinateur configuré pour rendre ses écrans disponibles et exécuter un serveur X a un nom d'hôte. Vous pouvez utiliser un écran d'hôtes à partir de n'importe quelle machine du même réseau en définissant votre DISPLAYvariable en conséquence sur DISPLAY=hostname:0.0. Ssh le fait pour vous de manière sensée si vous fournissez l' -Xoption.

* Remarque: je suppose qu'il existe un meilleur moyen que cette boucle for.

Si tout le reste échoue

Utilisez un éditeur de texte shell. vi, vim, nanoEt emacssont les plus communs et au moins un d'entre eux sera installé et opérationnel. Parmi eux, nanoc'est le plus simple et le plus explicite.

embrouiller
la source
@coding crow: Si vous êtes SSHing de Windows, cela dépend du client, que cela fonctionne ou non. Certains clients ne communiquent pas avec X11 et donc pas de transfert X - pour certains, cela fonctionne très bien. Si cela ne fonctionne pas, changez le client SSH pour Windows ou utilisez nano, vim ou emacs comme le suggère xyious dans sa réponse.
con-f-use
Oui, j'ai obtenu un vote négatif, je l'ai vu dans mon profil et je me suis demandé pourquoi il n'y avait aucun commentaire ou quoi que ce soit. Pas si important n'avait rien à voir avec vous, je me demandais simplement - content que votre problème soit résolu et je pourrais être un peu utile ici.
con-f-use
J'ai un peu modifié la forboucle ... elle affichera maintenant uniquement l'adresse d'affichage, par exemple :0 :0.0. N'hésitez pas à revenir en arrière si vous pensez que ce n'est pas ce que vous voulez ..
heemayl
0

Ce que con-f-use a dit .

Fondamentalement, vous avez un terminal via SSH et Gedit est un programme GUI. La réponse de con-f-use le fera fonctionner à partir d'une session client Linux GUI.

L'autre option serait d'utiliser un éditeur non GUI comme nano, Vi ou bien d'autres.

xyious
la source