Come si esegue un'applicazione grafica su un server remoto quando si accede tramite SSH?


14

Sto cercando di eseguire geditda un terminale SSH su Windows, collegato a un'istanza di Amazon EC2 che esegue Ubuntu 12.04 Server e visualizzo questo errore:

Cannot open display:

Come lo aggiusto?

Risposte:


14

Dato che stai usando Windows dalla tua parte, avrai bisogno di un client SSH che esegua un server X locale su Windows per eseguire applicazioni grafiche dal server in remoto sullo schermo.

Per esperienza, consiglierei il MobaXTerm gratuito che ha questa funzionalità integrata. Scaricalo e provalo:

inserisci qui la descrizione dell'immagine

Se si verificano errori, ciò è dovuto al fatto che a volte un'immagine minima del server potrebbe non essere configurata per consentire l' inoltro X in essa. In tal caso, ti preghiamo di commentare e ti aiuterò a risolverlo; L'ho fatto con molti VPS minimi con Ubuntu / Debian.


17

Quindi ti stai collegando dal tuo PC di casa (chiamiamolo macchina ) a un server (chiamiamolo server ) via ssh ? Vuoi avviare un programma con una finestra grafica sul server tramite la tua macchina? Se questo è corretto che sicuramente continuate a leggere.

Chiamiamo il programma per iniziare geditma il processo è lo stesso per tutti. A seconda di dove si desidera visualizzare la finestra grafica, passare all'intestazione corretta.

Finestra sullo schermo della macchina

Se vuoi vedere e usare la finestra di gedit sul tuo computer remoto ma avviare sul server, vorrai che la tua sessione di shell sia simile a questa:

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 

Non preoccuparti degli avvertimenti, sono normali: la finestra di gedit apparirà sullo schermo del tuo computer remoto come se fosse sul server. Il trucco è usare l'opzione "-X" come in ssh -Xcui abilita il tunneling X e imposta ilDISPLAY variabile a destra.

Ciò presuppone che tu stia utilizzando un client SSH che supporta X11 e che il tuo server ha un X-server in esecuzione (alcuni senza la necessità di GUI non eseguono un X-server). Soprattutto su Windows questo potrebbe essere un problema poiché la maggior parte dei programmi per terminali Windows non ha X. Come ha affermato izx, MobaXTerm è uno dei molti client SSH per Windows che ha un X-Server.

Per un server privo di X11, tuttavia, è necessario installarlo.

Sullo schermo del server

Puoi anche avviare un'istanza sullo schermo del tuo server chiamando gedit in questo modo:

ssh user@server
DISPLAY=:0.0 gedit

Devi sostituire il valore giusto invece di :0.0farlo sul giusto schermo X (importante solo se più schermi sono collegati al tuo server o se è in qualche modo peculiare nella sua configurazione).

Qui lo scenario più comune per non funzionare sarebbe se il server mancasse di un server X11 ma di quello non avrebbe un monitor collegato ad esso o non avrebbe un'interfaccia utente grafica e non dovresti leggere questo: D.

Un po 'di teoria

Non sono un esperto in questo, ma il mio modo di pensare in cui funziona è che ogni schermo fisico, cioè ogni monitor collegato ad un singolo computer ottiene un numero di esecuzione in forma di 0.0, 1.0, 2.0, ...

Questo numero è assegnato da X-Window-System aka X11. Questo è un livello per fornire una rete e un'interfaccia grafica di base su cui Unity, Gnome, KDE e simili possono costruire.

Puoi vedere quanti display ha una determinata macchina e quali numeri sono in esecuzione eseguendo for x in /tmp/.X11-unix/X*; do echo ":${x##*X}"; donesulla macchina in questione. * Quindi ogni computer configurato per rendere disponibili i suoi schermi ed esegue un server X ha un nome host. È possibile utilizzare le schermate di un host da qualsiasi macchina nella stessa rete impostando la DISPLAYvariabile di conseguenza DISPLAY=hostname:0.0. Ssh fa questo per te in modo ragionevole se offri l' -Xopzione.

* Nota: suppongo che ci sia un modo migliore di questo for-loop.

Se tutti gli altri falliscono

Utilizzare un editor di testo della shell. vi, vim, nanoE emacssono i più comuni e almeno uno di essi sarà installato e operativo. Di loro nanoè il più semplice e più autoesplicativo.


@coding crow: se stai eseguendo SSHing da Windows dipende dal client se funzionerà o meno. Alcuni client non comunicano con X11 e quindi senza X-forwarding - per alcuni anche se funziona bene. Se non funziona, cambia il client SSH per Windows o usa nano, vim o emacs come xyious ha suggerito nella sua risposta.
con-f-use

Sì, ho ottenuto un voto negativo, l'ho visto nel mio profilo e mi chiedevo perché non ci fossero commenti o altro. Non così importante non ha avuto a che fare con te, mi chiedevo solo: felice che il tuo problema sia risolto e che io possa esserti di aiuto.
con-f-use

Ho modificato forun po ' il loop .. ora mostrerà solo l'indirizzo del display, ad es :0 :0.0. Sentiti libero di tornare indietro se pensi che non sia quello che vuoi ..
heemayl

0

Cosa ha detto con-f-use .

Fondamentalmente hai un terminale tramite SSH e Gedit è un programma GUI. La risposta di con-f-use lo farà funzionare da una sessione client della GUI di Linux.

L'altra opzione sarebbe quella di utilizzare un editor non GUI come nano, Vi o numerosi altri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.