Como finalizar corretamente uma sessão do KDE a partir do shell sem privilégios de root

17

Estou acessando a máquina (OpenSuse 11 com KDE) pelo NX.

Não consigo usar os atalhos Alt-Ctrl-Del, pois são capturados pelo meu sistema. O botão de logoff normal encerra a sessão do NX sem encerrar a sessão do KDE. Não posso ligar kdm restartporque não tenho privilégios de root.

Outros palpites malucos gostam logoute exittambém não funcionam, o primeiro reclamando por não estar em um shell de login e o segundo apenas fechando o console.

Meu shell-fu é fraco, então qualquer ajuda é apreciada.

kostja
fonte
@ MartinSchröder - ah, boa captura - é essencialmente a mesma pergunta. Mas a resposta de Paulo a essa pergunta é mais exaustiva que a resposta de Gilles à outra.
7892 kostja

Respostas:

30

Você pode enviar um comando de logout via dbus para o KDE, que deve (se puder) terminar a sessão.

qdbus org.kde.ksmserver /KSMServer logout 0 0 0

O dbus é um sistema de mensagens que permite que os aplicativos se comuniquem, e o qdbuscomando é um utilitário para o envio de mensagens dbus para os aplicativos.

Os aplicativos são registrados no dbus, e a ksmserverparte do KDE é o gerenciador de sessões - ele cuida de quem está conectado.

Então, estamos enviando uma mensagem ksmserverpara a /KSMServerinterface e solicitando o logout. A mensagem que estamos enviando é exatamente a mesma que é enviada ao KSM quando você clica no ícone de logout na área de trabalho.

Os três zeros são parâmetros e podem alterar o tipo de logout que estamos fazendo:

Primeiro parâmetro:

  • 0 = Não espere pela confirmação
  • 1 = Aguardar confirmação (com um tempo limite de 30 segundos)

Segundo parâmetro:

  • -1 = Solicitar ação, padronizando o desligamento (faz sentido apenas quando se aguarda a confirmação.)
  • 0 = Logout
  • 1 = Reiniciar
  • 2 = Desligamento

O terceiro parâmetro é o "quando", mas não está claro qual é o seu impacto.

Paulo
fonte
Certifique-se de definir a DISPLAYvariável de ambiente (provavelmente :0) antes de executar este comando, caso contrário, ele irá reclamar.
palswim
3

A resposta aceita é uma solução específica para o KDE5, uma abordagem mais genérica seria

loginctl list-sessions
loginctl terminate-session <id>

ou

loginctl terminate-user <username>

Fonte

Existem mais comandos possíveis:

Session Commands:
  list-sessions            List sessions
  session-status [ID...]   Show session status
  show-session [ID...]     Show properties of sessions or the manager
  activate [ID]            Activate a session
  lock-session [ID...]     Screen lock one or more sessions
  unlock-session [ID...]   Screen unlock one or more sessions
  lock-sessions            Screen lock all current sessions
  unlock-sessions          Screen unlock all current sessions
  terminate-session ID...  Terminate one or more sessions
  kill-session ID...       Send signal to processes of a session

User Commands:
  list-users               List users
  user-status [USER...]    Show user status
  show-user [USER...]      Show properties of users or the manager
  enable-linger [USER...]  Enable linger state of one or more users
  disable-linger [USER...] Disable linger state of one or more users
  terminate-user USER...   Terminate all sessions of one or more users
  kill-user USER...        Send signal to processes of a user

Seat Commands:
  list-seats               List seats
  seat-status [NAME...]    Show seat status
  show-seat [NAME...]      Show properties of seats or the manager
  attach NAME DEVICE...    Attach one or more devices to a seat
  flush-devices            Flush all device associations
  terminate-seat NAME...   Terminate all sessions on one or more seats
noraj
fonte