(Adaptado do Linux: o wmctrl não pode abrir a exibição quando a sessão é iniciada via tela ssh + )
DISPLAY e AUTORIDADE
Um programa X precisa de duas informações para se conectar a um monitor X.
Ele precisa do endereço da exposição, que é normalmente :0
quando você está logado localmente ou :10
, :11
etc. quando você está logado remotamente (mas o número pode mudar dependendo de quantos X conexões estão ativos). O endereço da tela é normalmente indicado na DISPLAY
variável de ambiente.
Ele precisa da senha para a exibição. As senhas de exibição X são chamadas de cookies mágicos . Os cookies mágicos não são especificados diretamente: eles são sempre armazenados em arquivos de autoridade X, que são uma coleção de registros no formato “display :42
has cookie 123456
”. O arquivo de autoridade X é normalmente indicado na XAUTHORITY
variável de ambiente. Se $XAUTHORITY
não estiver definido, os programas serão usados ~/.Xauthority
.
Você está tentando agir nas janelas exibidas na área de trabalho. Se você é a única pessoa que usa sua máquina de mesa, é muito provável que o nome de exibição seja :0
. Encontrar a localização do arquivo de autoridade X é mais difícil, porque com o gdm configurado no Debian squeeze ou no Ubuntu 10.04, ele está em um arquivo com um nome gerado aleatoriamente. (Você não teve nenhum problema antes porque as versões anteriores do gdm usavam a configuração padrão, ou seja, os cookies armazenados ~/.Xauthority
.)
Obtendo os valores das variáveis
Aqui estão algumas maneiras de obter os valores de DISPLAY
e XAUTHORITY
:
Você pode iniciar sistematicamente uma sessão de tela na área de trabalho, talvez automaticamente em seus scripts de logon (a partir de ~/.profile
; mas fazê-lo apenas se estiver efetuando login no X: test se DISPLAY
estiver definido com um valor começando com :
(que deve cobrir todos os casos em que você provavelmente encontrar)). Em ~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
Então, na sessão ssh:
screen -d -r local
Você também pode salvar os valores de DISPLAY
e XAUTHORITY
em um arquivo e recuperar os valores. Em ~/.profile
:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
Na sessão ssh:
. ~/.local-display-setup.sh
screen
Você pode detectar os valores de DISPLAY
e XAUTHORITY
de um processo em execução. Isso é mais difícil de automatizar. Você precisa descobrir o PID de um processo conectado ao monitor em que deseja trabalhar e, em seguida, obter as variáveis de ambiente de /proc/$pid/environ
( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).
Copiando os cookies
Outra abordagem (seguindo uma sugestão de Arrowmaster ) é não tentar obter o valor de $XAUTHORITY
na sessão ssh, mas fazer com que a sessão X copie seus cookies ~/.Xauthority
. Como os cookies são gerados sempre que você faz login, não é um problema se você mantiver valores obsoletos ~/.Xauthority
.
Pode haver um problema de segurança se o diretório inicial estiver acessível por NFS ou outro sistema de arquivos de rede que permita que administradores remotos visualizem seu conteúdo. Eles ainda precisam se conectar à sua máquina de alguma forma, a menos que você tenha ativado as conexões X TCP (o Debian as desativou por padrão). Portanto, para a maioria das pessoas, isso não se aplica (sem NFS) ou não é um problema (sem conexões X TCP).
Para copiar cookies ao fazer login na sessão X da área de trabalho, adicione as seguintes linhas a ~/.xprofile
ou ~/.profile
(ou algum outro script que é lido quando você faz login):
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
Principle Em princípio, falta uma citação adequada, mas neste caso específico $DISPLAY
e $XAUTHORITY
não contém nenhum metacaractere do shell.