(Adapté de Linux: wmctrl ne peut pas ouvrir l’affichage lorsque la session est lancée via ssh + screen )
AFFICHAGE ET AUTORITÉ
Un programme X a besoin de deux informations pour se connecter à un affichage X.
Il a besoin de l'adresse de l'écran, généralement :0
lorsque vous vous connectez localement ou :10
, :11
etc. lorsque vous vous connectez à distance (mais le nombre peut changer en fonction du nombre de connexions X actives). L'adresse de l'affichage est normalement indiquée dans la DISPLAY
variable d'environnement.
Il a besoin du mot de passe pour l'affichage. Les mots de passe d'affichage X sont appelés des cookies magiques . Les cookies magiques ne sont pas spécifiés directement: ils sont toujours stockés dans des fichiers d'autorité X, qui sont une collection d'enregistrements de la forme «display :42
a cookie 123456
». Le fichier d'autorité X est normalement indiqué dans la XAUTHORITY
variable d'environnement. Si $XAUTHORITY
n'est pas défini, les programmes utilisent ~/.Xauthority
.
Vous essayez d’agir sur les fenêtres affichées sur votre bureau. Si vous êtes la seule personne à utiliser votre ordinateur de bureau, il est fort probable que le nom d'affichage le soit :0
. Il est plus difficile de trouver l'emplacement du fichier d'autorité X, car avec gdm configuré sous Debian Squeeze ou Ubuntu 10.04, il se trouve dans un fichier portant un nom généré aléatoirement. (Vous n'aviez aucun problème auparavant, car les versions précédentes de gdm utilisaient le paramètre par défaut, à savoir les cookies stockés dans ~/.Xauthority
.)
Obtenir les valeurs des variables
Voici quelques façons d'obtenir les valeurs de DISPLAY
et XAUTHORITY
:
Vous pouvez systématiquement démarrer une session écran à partir de votre bureau, peut-être automatiquement dans vos scripts de connexion (à partir de ~/.profile
; mais ne le faites que si vous vous connectez sous X: test si DISPLAY
est définie sur une valeur commençant par :
(qui devrait couvrir tous les cas dans lesquels vous êtes susceptible de rencontrer)). Dans ~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
Ensuite, dans la session SSH:
screen -d -r local
Vous pouvez également enregistrer les valeurs de DISPLAY
et XAUTHORITY
dans un fichier et les rappeler. Dans ~/.profile
:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
Dans la session SSH:
. ~/.local-display-setup.sh
screen
Vous pouvez détecter les valeurs de DISPLAY
et à XAUTHORITY
partir d' un processus en cours. C'est plus difficile à automatiser. Vous devez déterminer le PID d'un processus connecté à l'affichage sur lequel vous souhaitez travailler, puis extraire les variables d'environnement de /proc/$pid/environ
( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).
Copier les cookies
Une autre approche (à la suite d’une suggestion de Arrowmaster ) est de ne pas essayer d’obtenir la valeur de $XAUTHORITY
ssh dans la session ssh, mais bien de faire en sorte que la session X copie ses cookies dans ~/.Xauthority
. Comme les cookies sont générés à chaque fois que vous vous connectez, ce n'est pas un problème si vous conservez des valeurs périmées dans ~/.Xauthority
.
Il peut y avoir un problème de sécurité si votre répertoire personnel est accessible via NFS ou un autre système de fichiers réseau permettant aux administrateurs distants de visualiser son contenu. Ils auraient quand même besoin de se connecter à votre machine, sauf si vous avez activé les connexions X TCP (Debian les a désactivées par défaut). Donc, pour la plupart des gens, cela ne s'applique pas (pas de NFS) ou ne pose pas de problème (pas de connexions X TCP).
Pour copier des cookies lorsque vous vous connectez à votre session de bureau X, ajoutez les lignes suivantes à ~/.xprofile
ou ~/.profile
(ou à un autre script lu lors de votre connexion):
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
¹ En principe, il manque une citation correcte, mais dans ce cas précis $DISPLAY
, $XAUTHORITY
il ne contient aucun métacaractère shell.