Era uma vez,
DISPLAY=:0.0 totem /path/to/movie.avi
depois de ssh na minha área de trabalho do meu laptop faria com que o totem fosse reproduzido movie.avi
na minha área de trabalho.
Agora dá o erro:
No protocol specified Cannot open display:
Reinstalei o Debian squeeze quando ele ficou estável nos dois computadores e acho que quebrei a configuração.
Eu pesquisei sobre isso e não consigo descobrir o que devo estar fazendo.
(O VLC tem uma interface HTTP que funciona, mas não é tão conveniente quanto o ssh.)
O mesmo problema surge quando tento executar isso em um trabalho cron.
totem
não encontrar seu cookie X, e você precisa definirXAUTHORITY
o valor adequado, ou seja, o valor da sua sessão regular na área de trabalho. Leia Linux: wmctrl não pode abrir a tela quando a sessão é iniciada via tela ssh + para obter algum plano de fundo; veja também a resposta relacionada Como root, posso iniciar um programa gráfico na área de trabalho de outro usuário? .$XAUTHORITY
em~/.Xauthority
como todo mundo espera que ele seja.Respostas:
(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 naDISPLAY
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 cookie123456
”. O arquivo de autoridade X é normalmente indicado naXAUTHORITY
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
eXAUTHORITY
: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 seDISPLAY
estiver definido com um valor começando com:
(que deve cobrir todos os casos em que você provavelmente encontrar)). Em~/.profile
:Então, na sessão ssh:
Você também pode salvar os valores de
DISPLAY
eXAUTHORITY
em um arquivo e recuperar os valores. Em~/.profile
:Na sessão ssh:
Você pode detectar os valores de
DISPLAY
eXAUTHORITY
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):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.fonte
~/.xprofile
que só deve ser executado durante o login do X e fazer com que ele crie / atualize~/.Xauthority
com as informações corretas. Um link simbólico seria suficiente?~/.Xauthority
.xauth extract - $DISPLAY | xauth -f "$HOME/.Xauthority" merge -
em~/.xprofile
resolver o caso de múltiplos $ DISPLAY de?Eu resolvi esse problema adicionando
para
~/.xprofile
. Não sei se isso é totalmente seguro (eu ficaria muito interessado em ouvir o que as pessoas mais instruídas pensam), mas acho que é muito melhor do que desativar o controle de acesso (comxhost +
), como é comumente sugerido quando você google para este problema.fonte
localuser
endereços interpretados pelo servidor são completamente seguros. O Debian ainda faz isso por padrão como parte do processo de login (in/etc/X11/Xsession.d/35x11-common_xhost-local
). Consulte a página do manual Xsecurity para obter mais detalhes.xhost +
é provavelmente o suficiente na maioria dos casos ...xhost(1)
eXsecurity(7)
para documentos). Por si só, esse comando não permite nenhum tipo de acesso remoto ou encaminhamento X11 (para o qual o mecanismo "cookie mágico" é geralmente preferidoxhost
).Você precisa
export DISPLAY=:0.0
fonte
Funciona para mim, debian wheezy -> ubuntu confiável.
Nota: nesse caso, o servidor não está executando um gerenciador de exibição, é uma máquina virtual 'sem cabeça' sem placa gráfica ou monitor conectado.
A tela X no laptop mostra a saída do xterm em execução no servidor.
Depure usando:
strace
Se você der um monte de detalhes sangrentos sobre o que está fazendo, você será capaz de adivinhar onde fica parado - esperando por uma conexão ou o que quer que seja.Em uma linha ..
fonte