Como enviar um 'xmessage' como root remotamente ao usuário regular logado com sessão 'x'?

5

Estou usando o BASH na linha de comando, conectado ao PC de outro usuário como root, via SSH.

Desejo enviar o usuário atualmente logado executando uma sessão X, uma mensagem pop-up, mas esse é o resultado:

root@i5:~$ xmessage now                           
Invalid MIT-MAGIC-COOKIE-1 keyInvalid MIT-MAGIC-COOKIE-1 keyError: Can't open display: :0  

O resultado esperado foi uma mensagem pop-up na máquina remota, dizendo "agora".

Eu posso replicar isso na minha máquina local iniciando uma sessão x local, então em um terminal se eu digitar xmessage now ele funciona, mas se no terminal eu su- então eu sou root e tento novamente , Recebo o mesmo erro acima.

Eu também estou querendo usar isso em um script que precisa ser executado como root pelo cron, na minha máquina local e o script em certas instâncias, irá me alertar e solicitar que eu escolha um dos dois botões dando feedback para o script.

    
por Peter Snow 21.05.2013 / 10:37

4 respostas

1

Com a ajuda de esta página , agora tenho a solução que é a seguinte.

$ su
password:
$ xauth list
peter-aspire-ubuntu/unix:0  MIT-MAGIC-COOKIE-1  1978485c4f8d864503a4e645c77fd802
peter-aspire-ubuntu:0  MIT-MAGIC-COOKIE-1  1978485c4f8d864503a4e645c77fd802
$ DISPLAY=peter-aspire-ubuntu:0
$ export DISPLAY
$ cp /home/peter/.Xauthority /root/.Xauthority
cp: overwrite '/root/.Xauthority'? y
$ xmessage now

O resultado é o pretendido e atende a todos os cenários descritos na minha pergunta.

Obrigado a todos que participaram.

    
por 21.05.2013 / 12:19
2

Abrir uma janela pop-up na sessão da área de trabalho de outro usuário é um problema de segurança, portanto, isso não é permitido. Caso contrário, pode ser facilmente abusado por phishing ou outras tarefas maliciosas. Sem permissões especiais (como o acesso de superusuário), não há como realizar o que você deseja.

Mesmo com o acesso root na máquina, ainda é questionável se você deve abrir uma janela pop-up. Você não tem idéia de qual situação seu pop-up aparecerá ou até mesmo se ele aparecerá. Normalmente, o gerenciador de janelas está em tarefa para manipular as janelas recém-exibidas. Ele pode colocá-lo em algum lugar em uma viewport inativa ou semelhante, de modo que nem sequer se torne visível, embora esteja aberto.

Existe, no entanto, uma maneira padrão de entrar em contato com o usuário na máquina. Isso é wall . Esta ferramenta ainda requer permissões de root (para evitar spam), mas depois grava em todos os TTYs abertos, efetivamente notificando o usuário executando uma sessão X. Você pode querer considerar usar isso em vez de uma janela pop-up.

    
por 21.05.2013 / 11:10
2

A variável de ambiente $XAUTHORITY contém o caminho para o arquivo usado para conter os cookies de autorização do X11. Este padrão é ~/.Xauthority se não for definido.

Portanto, como root, você pode descobrir que o seguinte é suficiente para permitir que você abra janelas na tela de um usuário de desktop:

export DISPLAY=:0
export XAUTHORITY=~otheruser/.Xauthority
xmessage "Hello, otheruser."

Agora, isso não funcionará se o usuário não estiver armazenando seus cookies no arquivo padrão (isso acontece, por exemplo, nas versões recentes do Fedora). Nesse caso, você pode descobrir quais valores definir $DISPLAY e $XAUTHORITY com:

cat /proc/$(echo $(ps -C gnome-shell -o pid=))/environ | xargs --null --max-args=1 | egrep '^(DISPLAY|XAUTHORITY)='

(substituindo o gnome-shell pelo nome do gerenciador de janelas do usuário, ou algum outro processo que você tenha certeza de que eles estarão rodando).

    
por 21.05.2013 / 14:09
0

Uma maneira de fazer isso é permitir que seu computador se conecte ao servidor X do computador remoto usando a ferramenta xhost e X forwarding over SHH. No computador remoto, você precisa permitir que seu computador fale com ele. Isso requer que X11Forwarding esteja ativado no daemon SSH em execução no controle remoto.

No computador remoto:

xhost <local_ip>

No computador local:

export DISPLAY=<remote_ip>:<display>
ssh -Y <username>@<remote_ip> <x_application>

Por exemplo, se o seu controle remoto for 192.168.1.10 na sua rede local:

export DISPLAY=192.168.1.10:0
ssh -Y [email protected] xmessage now &
ssh -Y [email protected] xeyes &
    
por 21.05.2013 / 10:54