Perché il mio tentativo di inoltro X11 fallisce con "connect /tmp/.X11-unix/X0: nessun file o directory del genere"?


33

Sul mio computer locale, eseguo:

ssh -X me@remotemachine.com

(Per completezza, ho anche testato tutti i seguenti usando -Y con risultati identici).

Come previsto, questo accede bene a remotemachine.com e tutto sembra a posto. Se poi provo a eseguire xcalc, ottengo:

 connect /tmp/.X11-unix/X0: No such file or directory
 Error: Can't open display: localhost:10.0

Ma,

$ ls -la /tmp/.X11-unix/
total 36
drwxrwxrwt 2 root root  4096 2012-11-23 09:29 .
drwxrwxrwt 8 root root 32768 2012-11-29 08:22 ..
srwxrwxrwx 1 root root     0 2012-11-23 09:29 X0

Quindi non esiste solo /tmp/.X11-unix/X0, ma ha permessi universali r / w / x!

In precedenza ho usato x-forwarding senza problemi, anche se non da un po 'di tempo ...

uname -a sul server per riferimento:

Linux machinename 2.6.32-25-generic #45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux

Sono andato in giro sul web per un paio d'ore senza successo. Altre menzioni dello stesso problema, ma nessuna soluzione.


Si noti che è il file sul computer locale che è necessario controllare qui, non quello remoto. Vorrei usare strace -fo /tmp/trace ssh....per verificare che provi a connettere quel socket di dominio Unix.
Stéphane Chazelas,

Ah! Potrebbe essere. Stranamente, la mia macchina locale non ha una directory /tmp/.X11-unix/.
John Doucette,

Risposte:


24

Se hai un server X in esecuzione e la DISPLAYvariabile di ambiente è impostata su :0, indica alle applicazioni di connettersi al server X utilizzando un socket di dominio unix che si trova generalmente su Linux in /tmp/.X11-unix/X0(sebbene vedi sotto sullo spazio dei nomi astratto su Linux recente) .

Quando si invia alla macchina remota la macchina remotemachine , sshdsu remotemachine si imposta DISPLAY su localhost:10(ad esempio), che questa volta significa che le connessioni X vengono eseguite su TCP alla porta 6010 dell'host locale della macchina. sshd on remotemachine ascolta le connessioni lì e inoltra qualsiasi connessione in entrata al client ssh. Il client SSH tenta quindi di connettersi /tmp/.X11-unix/X0(dall'estremità locale, non dal telecomando) per contattare il proprio server X.

Ora, forse non hai un server X in esecuzione (sei su Mac?) O forse il socket del dominio unix non si trova in /tmp/.X11-unix, il che significa che ssh non è stato configurato correttamente durante la compilazione tempo.

Per capire quale sia il percorso corretto per il socket unix, potresti provare un strace -e connect xlogo(o l'equivalente sul tuo sistema) sul tuo computer locale per vedere cosa fa una normale applicazione X.

netstat -x | grep X può anche dare un indizio.

Per la cronaca, su una macchina wheezy di Debian Linux qui, Xorg ascolta sia /tmp/.X11-unix/X0nel filesystem che /tmp/.X11-unix/X0nello spazio dei nomi astratto (generalmente scritto @/tmp/.X11-unix/X0). Da ora strace, le applicazioni X11 sembrano usare quello spazio dei nomi astratto per impostazione predefinita, il che spiega perché quelli funzionano ancora se /tmp/.X11-unixvengono rimossi, mentre sshnon usano quello spazio dei nomi astratto.


1
O controlla lsof -p <PID of your local X server>dove dovresti essere in grado di trovare il /some/thing/Xnfile, nessendo il tuo DISPLAYnumero.
peterph,

Grazie, è stato molto utile. In qualche modo il mio file /tmp/.X11-unix/X0 è stato rimosso, sebbene fosse ancora in esecuzione un server X. Un riavvio rapido sembra aver risolto il problema. Forse causato da alcuni aggiornamenti che ho fatto qualche tempo fa.
John Doucette,

6
Cambiare la variabile DISPLAY da ": 0.0" a "localhost: 0.0" sembra aver fatto il trucco per me, almeno collegandomi da Cygwin a Linux.
m0j0

FWIW, ho dovuto correre startxwin(dopo apt-cyg install xinit) cygwindall'host perché sto collegando Windows locale a unix remoto
Jonathan

40

Ho avuto lo stesso problema con Cygwin e Xming, connettendomi a un server Linux remoto.

La mia variabile $ DISPLAY era semplicemente ": 0.0" in Cygwin e sebbene funzionasse localmente, non funzionava con il comando remoto ssh.

La modifica della variabile in "localhost: 0.0" ha risolto il problema.

export DISPLAY=localhost:0.0

Una volta che l'ho fatto, il mio comando ha funzionato:

ssh -Yf user@host gvim somefile.c

5
Questo è stato il problema per me anche usando i servizi di Windows per Linux.
lapo,

1
Su quale server hai eseguito il export ...comando? 1) macchina locale 2) server
abalter

1
@abalter Ha funzionato per me eseguendolo sulla macchina locale
Tralston

3
Ho impostato un problema di debug di 2 ore con Cygwin ssh + VcXsrv perché ho impostato DISPLAY=:0 ssh -Y $host. Cambiandolo in DISPLAY=localhost:0problema magicamente risolto.
gavenkoa

1
Ottima risposta, ancora utile per eseguire il sottosistema Ubuntu in Windows
Tom Swifty il

6

Ciò integra altre risposte con informazioni specifiche dal sottosistema Windows per Linux. La risposta accettata è corretta: la tua DISPLAYvariabile non è configurata correttamente. Non è esattamente chiaro, tuttavia, perché sia ​​il caso di quella sola risposta, quindi sto rimediando a questa risposta.

Se si esegue cygwin o il sottosistema Windows per Linux e il server X11 è basato su Windows (ad es VcXsrv , o XMing), è più probabile che il tuo server X11 sia in ascolto su una porta TCP (come 127.0.0.1su porte TCP 6000-6010) che su il socket del dominio Unix predefinito ( /tmp/.X11-unix/X0). I socket Unix non sono ben supportati su Windows in questo momento, anche all'interno di WSL. Anche la comunicazione tra programmi in ambiente simile a Linux e programmi in esecuzione direttamente sull'host Windows è generalmente più semplice su socket IP.

Quando si eseguono applicazioni grafiche localmente (ovvero dall'ambiente Cygwin o WSL del proprio host) e il proprio DISPLAY variabile è impostata sul valore predefinito (ad es. DISPLAY=:0.0), Le applicazioni tenteranno innanzitutto di connettersi al server X tramite il socket Unix /tmp/.X11-unix/X0. Ciò fallirà, ma la maggior parte delle applicazioni eseguirà quindi il fallback su una connessione TCP localhost, che dovrebbe riuscire a raggiungere il server, presupponendo che il server X sia configurato con impostazioni predefinite.

È possibile confermare che ciò sta accadendo cercando le connect()chiamate nei registri di strace da un'esecuzione dell'applicazione grafica. Generalmente ciò accadrebbe presto, prima che appaia la finestra principale dell'applicazione.

Questo comportamento di fallback non si verifica quando ssh sta reindirizzando una connessione dal lato remoto, quindi stai ottenendo quell'errore. sshdsta effettivamente inoltrando la connessione al lato locale, ma la connessione locale del client ssh si interrompe poiché non riesce a raggiungere il server tramite il socket Unix. Viene quindi visualizzato l' ENOENTerrore.

In questi casi, modificando la DISPLAYvariabile per utilizzare la sintassi TCP anziché la :0.0sintassi, è possibile risolvere il problema:

DISPLAY=127.0.0.1:0 ssh remote some-gui-application

Come altre risposte menzionate, è anche possibile esportare quella variabile in modo interattivo dal prompt della shell:

$ export DISPLAY=127.0.0.1:0
...
$ ssh remote some-gui-application

È inoltre possibile memorizzare questa impostazione in modo permanente aggiungendo quella riga allo script di inizializzazione del profilo della shell di accesso (ad es ~/.bash_profile .).

Nota: alcune shell hanno uno script di inizializzazione diverso per le sessioni di accesso e non di accesso. Ad esempio, con bash è possibile scrivere quella riga nello script non di accesso, ovvero ~/.bashrcanziché ~/.bash_profile. Se lo fai, fai attenzione a non sovrascrivere alcun valore personalizzato che potrebbe essere stato impostato da ssh. Questo sarebbe il caso se saltassi prima nel tuo host tramite ssh e poi saltassi di nuovo in un altro host (annidando così il tuo inoltro X11).


3

Se il tuo host di visualizzazione è macOS , assicurati di avere XQuartz in esecuzione.

Questo messaggio di errore ti dice che il tunnel ssh sta funzionando, ma non riesce a capire come connettersi al server X sul tuo lato del tunnel .

Ai vecchi tempi, Mac OS X avviava XQuartz per te, ma a quanto pare abbiamo abbandonato questa bella piccola funzionalità nella versione macOS del terminale.


follow-up: Invalid MIT-MAGIC-COOKIE-1 keyxterm Xt error: Can't open display: localhost:10.0significava "devi uscire e riaccedere dopo aver avviato XQuartz" FWIW ...
rogerdpack

1

Ho appena avuto lo stesso problema. La cosa confusa è che si ottiene l'errore no-such-file sul computer remoto , ma in realtà questo file manca sul locale computer (display).

Solo per vedere cosa sarebbe successo, ho creato manualmente il file mancante (fifo, in realtà), sul display, in questo modo:

mkfifo /tmp/.X11-unix/X0

Quindi si immerse di nuovo nella macchina remota, ed ecco, X11 si collegò bene.

Non so se questo sia rilevante o meno, ma il mio display non è Linux, è Windows con cygwin e VcXsrv. (La macchina remota è Linux)


4
/tmp/.X11-unix/X0è un socket di dominio unix, non un FIFO
Samveen il

0

Ho riscontrato questo problema utilizzando il sottosistema Windows per Linux . Il problema è che non avevo una GUI installata sul client, a causa del presupposto che dal momento che è una macchina Windows, ho una GUI.

Per verificare se si dispone di una GUI, eseguire xclocksul client. Se viene visualizzato l'errore, Error: Can't open display: :0è necessario installare un programma GUI per Windows. Ho usato Xserver .

Dopo aver installato una GUI, provare i seguenti comandi:

export DISPLAY=:0
xclock

Se arriva un orologio, allora il successo!

Ora prova a lanciarti nel server, quindi esegui xclock. Hai ancora ricevuto i messaggi di errore connect /tmp/.X11-unix/X0: nessun file o directory simile Errore: Impossibile aprire display: localhost: 10.0 ? Questo perché il server sta tentando di connettersi a se stesso per visualizzare la GUI. Invece, vuoi che la variabile DISPLAY sia impostata su un indirizzo dove il server può ottenere il tuo computer. Quindi, se è su una LAN, inseriresti semplicemente il nome del tuo computer. Se ci si connette a un server sulla WAN, è necessario specificare l'IP esterno del router e disporre della porta corretta inoltrata.

LAN: export DISPLAY=ComputerName:0
WAN:export DISPLAY=257.257.257.257:0


"Inoltro X" significa "tunneling del protocollo X dalle applicazioni in esecuzione sul computer remoto (server, nel tuo caso) al computer locale (client, nel tuo caso)", quindi ovviamente devi eseguire un server X (e non "qualsiasi programma GUI") sul computer locale. Windows da solo non capisce il protocollo X, anche se "hai una GUI".
Dirkt

-2

Se funzionava bene e smetteva di funzionare senza una ragione adeguata, probabilmente potrebbe essere un'istanza X non controllata in esecuzione in background. Si prega di chiudere utilizzando Task Manager.

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.