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 nelDISPLAY
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 cookie123456
”. Il file di autorità X è normalmente indicato nelXAUTHORITY
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 seDISPLAY
è 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
eXAUTHORITY
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
eXAUTHORITY
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)=')
¹).
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.