(Adaptado de Linux: wmctrl no puede abrir la pantalla cuando la sesión se inicia a través de ssh + pantalla )
PANTALLA y AUTORIDAD
Un programa X necesita dos piezas de información para conectarse a una pantalla X.
Se necesita la dirección de la pantalla, que es normalmente :0
cuando está conectado localmente o :10
, :11
, etc, cuando está conectado de forma remota (pero el número puede cambiar dependiendo del número de conexiones X están activos). La dirección de la pantalla normalmente se indica en la DISPLAY
variable de entorno.
Necesita la contraseña para la pantalla. Las contraseñas de visualización X se llaman cookies mágicas . Las cookies mágicas no se especifican directamente: siempre se almacenan en archivos de autoridad X, que son una colección de registros de la forma "pantalla :42
tiene cookie 123456
". El archivo de autoridad X normalmente se indica en la XAUTHORITY
variable de entorno. Si $XAUTHORITY
no está configurado, los programas lo usan ~/.Xauthority
.
Estás intentando actuar en las ventanas que se muestran en tu escritorio. Si eres la única persona que usa tu máquina de escritorio, es muy probable que el nombre para mostrar sea :0
. Encontrar la ubicación del archivo de autoridad X es más difícil, porque con gdm configurado en Debian squeeze o Ubuntu 10.04, está en un archivo con un nombre generado aleatoriamente. (No tenía ningún problema antes porque las versiones anteriores de gdm usaban la configuración predeterminada, es decir, las cookies almacenadas en ~/.Xauthority
).
Obteniendo los valores de las variables
Aquí hay algunas formas de obtener los valores de DISPLAY
y XAUTHORITY
:
Puede iniciar sistemáticamente una sesión de pantalla desde su escritorio, tal vez automáticamente en sus scripts de inicio de sesión (desde ~/.profile
; pero hágalo solo si inicia sesión en X: pruebe si DISPLAY
está configurado en un valor que comience desde :
(eso debería cubrir todos los casos que probablemente encontrar)). En ~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
Luego, en la sesión ssh:
screen -d -r local
También puede guardar los valores de DISPLAY
y XAUTHORITY
en un archivo y recuperar los valores. En ~/.profile
:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
En la sesión ssh:
. ~/.local-display-setup.sh
screen
Puede detectar los valores de DISPLAY
y XAUTHORITY
desde un proceso en ejecución. Esto es más difícil de automatizar. Debe averiguar el PID de un proceso que está conectado a la pantalla en la que desea trabajar, luego obtener las variables de entorno de /proc/$pid/environ
( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).
Copiando las cookies
Otro enfoque (siguiendo una sugerencia de Arrowmaster ) es no intentar obtener el valor de $XAUTHORITY
la sesión ssh, sino hacer que la sesión X copie sus cookies ~/.Xauthority
. Dado que las cookies se generan cada vez que inicia sesión, no es un problema si mantiene valores obsoletos ~/.Xauthority
.
Puede haber un problema de seguridad si se puede acceder a su directorio de inicio a través de NFS u otro sistema de archivos de red que permita a los administradores remotos ver su contenido. Todavía tendrían que conectarse a su máquina de alguna manera, a menos que haya habilitado las conexiones X TCP (Debian las tiene desactivadas por defecto). Entonces, para la mayoría de las personas, esto no se aplica (sin NFS) o no es un problema (sin conexiones X TCP).
Para copiar cookies cuando inicia sesión en su sesión X de escritorio, agregue las siguientes líneas ~/.xprofile
ao ~/.profile
(o algún otro script que se lea cuando inicie sesión):
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 principio, esto carece de una cita adecuada, pero en este caso específico $DISPLAY
y $XAUTHORITY
no contendrá ningún metacarácter de shell.