Qual é a melhor maneira de encontrar o DISPLAY e o XAUTHORITY atuais no shell não interativo para o usuário atual? [duplicado]

3

Eu tenho um projeto que precisa detectar o DISPLAY no shell () para exibir algumas coisas no site máquina.

Ou uma solução melhor (?) para abrir coisas em shell não interativo sem tentar descobrir DISPLAY e XAUTHORITY .

Eu posso definir DISPLAY=:0 , mas isso falhará se um usuário usar outra sessão.

Tanto quanto eu não estou no modo interativo, o que eu tentei (funciona bem, mas apenas como root) é:

strings /proc/$(pidof Xorg)/environ | grep -Eo 'DISPLAY=:[0-9]+(:[0-9])*'

ou como usuário:

ps uww $(pidof Xorg) | grep -oE '[[:blank:]]:[0-9]+(:[0-9])*\b'

Mas eu não sei se é confiável em qualquer Linux (Unixes?)

Existe uma maneira mais confiável / portátil?

    
por Gilles Quenot 08.03.2018 / 20:07

2 respostas

1

Soluçãofinalquenãoprecisaserrooteacessívelapartirdeumshellnãointerativodemaneiraautomatizadaemaisavançadaeutilizávelquepossívelduplicadofornecidoanteriormente:

-XAUTHORITY:

ps-u$(id-u)-opid=|xargs-I{}cat/proc/{}/environ2>/dev/null|tr'
ps-u$(id-u)-opid=|xargs-I{}cat/proc/{}/environ2>/dev/null|tr'
ps-u$(id-u)-opid=|xargs-I{}cat/proc/{}/environ2>/dev/null|tr'
ps-u$(id-u)-opid=|xargs-I{}cat/proc/{}/environ2>/dev/null|tr'%pre%''\n'|grep-m1'^DISPLAY='
''\n'|grep-m1'^XAUTHORITY='
''\n'|grep-m1'^DISPLAY='
''\n'|grep-m1'^XAUTHORITY='

-DISPLAY:

%pre%

Otrechodelistadetodososusuáriospids,iterarásobreelesequebraránaprimeiracorrespondência

Combaseno presente

    
por 09.03.2018 / 05:56
3

Em distribuições com o sistema init systemd da saída de

systemctl --user show-environment

mostra DISPLAY e XAUTHORITY . Isso é pelo menos verdadeiro para meu sistema debian 9 com systemd e gdm3 como gerenciador de exibição.

Pitfall: Depois de executar startx xterm -- :2 vt2 em tty2 systemctl me deu DISPLAY e XAUTHORITY da nova exibição; minha exibição principal :0 não era mais observável desta maneira.

Outras abordagens:

Pelo menos para XAUTHORITY , é mais confiável analisar a saída de ps aux | grep Xorg e procurar a opção -auth . No meu caso, ele está localizado em /run/user/1000/gdm/Xauthority e não em ~/.Xauthority .

Armadilhas:

  • Pode haver mais de uma instância do Xorg.
  • Em vez do Xorg, pode haver Xwayland .
  • Em vez do Xorg, pode haver Xvfb ou outra coisa.
  • Pode ser uma sessão remota sem o Xorg local.

Normalmente, os comandos Xorg também contêm o número de exibição. Infelizmente, o meu não:

/usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3

-displayfd 3 de alguma forma aponta para DISPLAY . Se estiver procurando como root em /proc/$(pidof Xorg)/fd/3 , localizo

    lrwx------ 1 root root 64 Mär  8 22:45 3 -> socket:[21437]

No entanto, não sei como procurar o soquete 21437 . Tenho certeza de que aponta para /tmp/.X11-unix/X0 . Uma abordagem é lsof +E -aUc Xorg que mostra uma saída interessante: muitas conexões contendo @/tmp/.X11-unix/X0 e uma dbus conexão.

Um pouco sujo: A pasta fd também me mostra

l-wx------ 1 root root 64 Mär  8 22:45 5 -> /var/log/Xorg.0.log

Xorg.0.log é uma indicação clara para exibição :0 .

Outra abordagem: notify-send parece reunir DISPLAY e XAUTHORITY com alguma dbus magic. Mas eu não tenho ideia de como. Essa pode ser a maneira mais limpa e mais portátil, se pelo menos um daemon dbus estiver rodando.

    
por 08.03.2018 / 21:14