GNU/Linux >> Linux Esercitazione >  >> Linux

Ssh:apri una finestra su un display X remoto (perché "non è possibile aprire il display")?

C'era una volta,

DISPLAY=:0.0 totem /path/to/movie.avi

dopo aver eseguito un ssh sul desktop dal mio laptop, il totem potrebbe riprodurre movie.avi sul mio desktop.

Ora dà l'errore:

No protocol specified
Cannot open display:

Ho reinstallato Debian squeeze quando è diventato stabile su entrambi i computer e credo di aver interrotto la configurazione.

Ho cercato su Google su questo e non riesco per la mia vita a capire cosa dovrei fare.

(VLC ha un'interfaccia HTTP che funziona, ma non è conveniente come ssh.)

Lo stesso problema sorge quando provo a eseguirlo da un lavoro cron.

Risposta accettata:

(Adattato da Linux:wmctrl non può aprire il display quando la sessione è iniziata tramite ssh+screen)

VISUALIZZAZIONE e AUTORITÀ

Un programma X ha bisogno di due informazioni per connettersi a un display X.

  • Ha bisogno dell'indirizzo del display, che in genere è :0 quando hai effettuato l'accesso localmente o :10 , :11 , ecc. quando sei connesso da remoto (ma il numero può cambiare a seconda di quante connessioni X sono attive). L'indirizzo del display è normalmente indicato nel DISPLAY variabile di ambiente.

  • È necessaria la password per il display. Le password di visualizzazione di X sono chiamate cookie magici . I cookie magici non sono specificati direttamente:sono sempre memorizzati in X authority file, che sono una raccolta di record della forma “visualizza :42 ha il cookie 123456 ”. Il file di autorità X è normalmente indicato nel XAUTHORITY variabile d'ambiente. Se $XAUTHORITY non è impostato, i programmi usano ~/.Xauthority .

Stai cercando di agire sulle finestre visualizzate sul desktop. Se sei l'unica persona che utilizza il tuo computer desktop, è molto probabile che il nome visualizzato sia :0 . Trovare la posizione del file di autorità X è più difficile, perché con gdm impostato in Debian squeeze o Ubuntu 10.04, è in un file con un nome generato casualmente. (Non hai avuto problemi prima perché le versioni precedenti di gdm utilizzavano l'impostazione predefinita, ovvero i cookie memorizzati in ~/.Xauthority .)

Ottenere i valori delle variabili

Ecco alcuni modi per ottenere i valori di DISPLAY e XAUTHORITY :

  • Puoi avviare sistematicamente una sessione dello schermo dal tuo desktop, magari automaticamente nei tuoi script di accesso (da ~/.profile; ma fallo solo se accedi sotto X:verifica se DISPLAY è impostato su un valore che inizia con : (che dovrebbe coprire tutti i casi che potresti incontrare)). In ~/.profile :

    case $DISPLAY in
      :*) screen -S local -d -m;;
    esac
    

    Quindi, nella sessione ssh:

    screen -d -r local
    
  • Puoi anche salvare i valori di DISPLAY e XAUTHORITY in un file e richiamare i valori. In ~/.profile :

    case $DISPLAY in
      :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
    esac
    

    Nella sessione ssh:

    . ~/.local-display-setup.sh
    screen
    
  • Potresti rilevare i valori di DISPLAY e XAUTHORITY da un processo in corso. Questo è più difficile da automatizzare. Devi capire il PID di un processo che è collegato al display su cui vuoi lavorare, quindi ottenere le variabili di ambiente da /proc/$pid/environ (eval export $(</proc/$pid/environ tr \0 \n | grep -E '^(DISPLAY|XAUTHORITY)=') ¹).

Correlati:esistono frequenze radio aperte/illimitate che possono essere utilizzate gratuitamente?

Copiare i cookie

Un altro approccio (su suggerimento di Arrowmaster) è di non cercare di ottenere il valore di $XAUTHORITY nella sessione ssh, ma invece per fare in modo che la sessione X copi i suoi cookie in ~/.Xauthority . Poiché i cookie vengono generati ogni volta che accedi, non è un problema se mantieni i valori non aggiornati in ~/.Xauthority .

Potrebbe esserci un problema di sicurezza se la tua home directory è accessibile tramite NFS o altro file system di rete che consente agli amministratori remoti di visualizzarne il contenuto. Avrebbero comunque bisogno di connettersi alla tua macchina in qualche modo, a meno che tu non abbia abilitato le connessioni X TCP (Debian le ha disattivate per impostazione predefinita). Quindi per la maggior parte delle persone, questo non si applica (nessuna NFS) o non è un problema (nessuna connessione X TCP).

Per copiare i cookie quando accedi alla sessione X del desktop, aggiungi le seguenti righe a ~/.xprofile o ~/.profile (o qualche altro script che viene letto quando accedi):

case $DISPLAY:$XAUTHORITY in
  :*:?*)
    # DISPLAY is set and points to a local display, and XAUTHORITY is
    # set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
    XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac

¹ In linea di principio manca una virgoletta adeguata, ma in questo caso specifico $DISPLAY e $XAUTHORITY non conterrà alcun metacarattere della shell.


Linux
  1. Ssh:perché Firefox è così lento rispetto a Ssh?

  2. Ctrl-c Gestione nella sessione Ssh?

  3. Consenti accesso Ssh remoto?

  4. xhost+:come correggere l'errore "Impossibile aprire il display" durante l'avvio della GUI sul server remoto

  5. Passaggio di variabili nel comando ssh remoto

Esegui comandi su sistemi Linux remoti tramite SSH

SSHFS:montaggio di un file system remoto su SSH

Come aprire una finestra di un terminale Linux

Come utilizzare SSH per connettersi a un server remoto

Procedura:Amministrazione remota di FreeBSD

Perché la porta 1111 è aperta ed è sicuro esserlo?