Como faço para iniciar corretamente um dbus-monitor --session como root?

2

Estou trabalhando em um script que detecta se e quando uma sessão do Gnome é "bloqueada" por um usuário para chutar o usuário e impedir que pessoas bloqueiem telas em um laboratório de uso público. No entanto, parece que a única maneira de fazer isso é lançar um monitor dbus da seguinte forma:

dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"

Infelizmente, não consigo fazer isso funcionar como root, não importa quantas coisas eu tente. Eu tentei o seguinte:

1

eval 'dbus-launch'
dbus-monitor --session ...

Isso não é iniciado com o mesmo erro

2

export $(dbus-launch)
dbus-monitor --session ...

Isso inicia, mas não monitora com êxito as mensagens.

3

eval 'dbus-launch'
export DBUS_SESSION_BUS_ADDRESS
dbus-monitor --session ...

Isso inicia, mas não monitora as mensagens

O erro exato quando recebo o erro da sessão X11 é o seguinte:

Failed to open connection to session message bus: dbus-launch failed to autolaunch D-Bus session: Fd 4 did not have the close-on-exec flag set!  Setting the flag.
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

Autolaunch error: X11 initialization failed.
Então, simplesmente, eu preciso ser capaz de monitorar remotamente a sessão org.gnome.ScreenSaver dbus messages (idealmente como root, já que configurar um novo usuário pode ser uma dor) e não consigo descobrir como fazer isso. Também deve ser adicionado que, se eu estiver logado como um usuário, posso executar o comando dbus-monitor sozinho sem nenhum problema (ele registra como esperado).

Mais informações porque não pode prejudicar.

Kernel: RHEL5

 2.6.18-406.el5

Versão do DBUS:

D-Bus Message Bus Launcher 1.1.2

Versão do GNOME:

2.16.0
    
por Merglyn 17.06.2015 / 18:23

1 resposta

4

O problema é que o dbus-monitor não sabe onde se conectar enquanto está executando como usuário / sessão diferente (root). Você pode obter o DBUS ADDRESS do ambiente com algo como:

DBUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s gnome-session)/environ)
dbus-monitor --session --address "$DBUS_ADDRESS"  "type=signal,interface=org.gnome.ScreenSaver"

Esses comandos tentam encontrar o processo em execução com pidof -s gnome-session , então olham para o ambiente e grep para o DBUS_SESSION_BUS_ADDRESS e o atribuem a DBUS_ADDRESS, então usam a variável para informar ao dbus-monitor qual bus de mensagem monitorar.

Lembre-se de que, se você tiver várias sessões, funcionará apenas com o "primeiro".

    
por 19.06.2015 / 19:36