1

1

Estou trabalhando em um script que detectará se e quando uma sessão do Gnome está "bloqueada" por um usuário, a fim de expulsar esse usuário e evitar que pessoas bloqueiem telas em um laboratório de uso público. No entanto, parece que a única maneira de fazer isso é iniciar um monitor dbus da seguinte maneira:

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 falha ao iniciar com o mesmo erro

2

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

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

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 de 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.

Simplesmente, preciso ser capaz de monitorar as mensagens dbus da sessão org.gnome.ScreenSaver remotamente (de preferência 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 acrescentado que, se eu estiver logado como usuário, posso executar o comando dbus-monitor sozinho, sem problemas (ele registra conforme o esperado).

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

Núcleo: RHEL5

 2.6.18-406.el5

Versão DBUS:

D-Bus Message Bus Launcher 1.1.2

Versão do GNOME:

2.16.0

Responder1

O problema é que o dbus-monitor não sabe onde se conectar, pois está sendo executado como um usuário/sessão diferente (root). Você pode obter o ENDEREÇO ​​DBUS do ambiente com algo como:

DBUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s gnome-session)/environ)
dbus-monitor --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 DBUS_SESSION_BUS_ADDRESS e atribuem-no a DBUS_ADDRESS, então usam a variável para informar ao dbus-monitor qual barramento de mensagens monitorar.

Lembre-se de que se você tiver várias sessões só funcionará com a "primeira".

informação relacionada