(Adattato da Linux: wmctrl non può aprire il display quando la sessione viene avviata tramite ssh + screen )
DISPLAY e AUTORITÀ
Un programma X necessita di due informazioni per connettersi a un display X.
Ha bisogno dell'indirizzo del display, che in genere è :0
quando si è connessi localmente o :10
, :11
ecc. Quando si è effettuato l'accesso in remoto (ma il numero può cambiare a seconda di quante connessioni X sono attive). L'indirizzo del display è normalmente indicato nella DISPLAY
variabile d'ambiente.
Ha bisogno della password per il display. Le password di visualizzazione X sono chiamate cookie magici . I cookie magici non sono specificati direttamente: sono sempre memorizzati in file di autorità X, che sono una raccolta di record del modulo "display :42
has cookie 123456
". Il file di autorità X viene normalmente indicato nella XAUTHORITY
variabile di ambiente. Se $XAUTHORITY
non impostato, i programmi usano ~/.Xauthority
.
Stai tentando 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 come impostato in Debian squeeze o Ubuntu 10.04, si trova in un file con un nome generato casualmente. (Non hai mai avuto problemi prima perché le versioni precedenti di gdm utilizzavano l'impostazione predefinita, ovvero i cookie memorizzati ~/.Xauthority
.)
Ottenere i valori delle variabili
Ecco alcuni modi per ottenere i valori di DISPLAY
e XAUTHORITY
:
È possibile avviare sistematicamente una sessione dello schermo dal desktop, magari automaticamente negli script di accesso (da ~/.profile
; ma farlo solo se si accede in X: test se DISPLAY
è impostato su un valore che inizia con :
(che dovrebbe coprire tutti i casi che è probabile Incontrare)). In ~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
Quindi, nella sessione ssh:
screen -d -r local
È inoltre possibile 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
È possibile rilevare i valori di DISPLAY
e XAUTHORITY
da un processo in esecuzione. Questo è più difficile da automatizzare. Devi capire il PID di un processo collegato al display su cui vuoi lavorare, quindi ottenere le variabili d'ambiente da /proc/$pid/environ
( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).
Copia dei cookie
Un altro approccio (a seguito di un suggerimento di Arrowmaster ) è di non cercare di ottenere il valore di $XAUTHORITY
nella sessione ssh, ma piuttosto di fare in modo che la sessione X copi i suoi cookie ~/.Xauthority
. Poiché i cookie vengono generati ogni volta che accedi, non è un problema se mantieni i valori non aggiornati ~/.Xauthority
.
Può esserci un problema di sicurezza se la tua home directory è accessibile tramite NFS o altri file system di rete che consente agli amministratori remoti di visualizzarne i contenuti. Dovrebbero comunque connettersi al tuo computer in qualche modo, a meno che tu non abbia abilitato le connessioni X TCP (Debian le ha disattivate di default). Quindi, per la maggior parte delle persone, questo non si applica (nessun NFS) o non è un problema (nessuna connessione X TCP).
Per copiare i cookie quando si accede alla sessione X del desktop, aggiungere le seguenti righe a ~/.xprofile
o ~/.profile
(o qualche altro script letto al momento dell'accesso):
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, questo non ha una quotazione corretta, ma in questo caso specifico $DISPLAY
e $XAUTHORITY
non conterrà alcun metacarattere shell.