Jak poprawnie zakończyć sesję KDE z powłoki bez uprawnień roota

17

Uzyskuję dostęp do komputera (OpenSuse 11 z KDE) przez NX.

Nie mogę używać skrótów Alt-Ctrl-Del, ponieważ są one przechwytywane przez mój system. Zwykły przycisk wylogowania kończy sesję NX bez kończenia sesji KDE. Nie mogę dzwonić, kdm restartponieważ nie mam uprawnień roota.

Inne dzikie domysły lubią logouti exitnie działają, pierwszy narzeka, że ​​nie jest w powłoce logowania, a drugi tylko zamyka konsolę.

Mój shell-fu jest słaby, więc doceniam każdą pomoc.

kostja
źródło
@ MartinSchröder - ach, dobry połów - to w zasadzie to samo pytanie. Ale odpowiedź Paula na to pytanie jest bardziej wyczerpująca niż odpowiedź Gillesa na drugie.
kostja

Odpowiedzi:

30

Możesz wysłać polecenie wylogowania przez dbus do KDE, które powinno (jeśli to możliwe) zakończyć sesję.

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

dbus to system przesyłania wiadomości, który umożliwia aplikacjom komunikację między sobą, a qdbuspolecenie to narzędzie do wysyłania komunikatów dbus do aplikacji.

Aplikacje rejestrują się w dbus, a ksmserverczęścią KDE jest menedżer sesji - dba o to, kto jest zalogowany.

Więc wysyłasz wiadomość ksmserverdo /KSMServerinterfejsu i informując go, aby się wylogować. Wiadomość, którą wysyłamy, to dokładnie ta sama wiadomość, która jest wysyłana do KSM po kliknięciu ikony wylogowania na pulpicie.

Trzy zera są parametrami i mogą zmieniać typ wylogowywania, który wykonujemy:

Pierwszy parametr:

  • 0 = Nie czekaj na potwierdzenie
  • 1 = Poczekaj na potwierdzenie (z 30-sekundowym limitem czasu)

Drugi parametr:

  • -1 = Monituj o akcję, domyślnie wyłącza się (ma sens tylko w przypadku oczekiwania na potwierdzenie).
  • 0 = wyloguj się
  • 1 = Uruchom ponownie
  • 2 = Wyłącz

Trzeci parametr to parametr „kiedy”, ale nie jest jasne, jaki jest jego wpływ.

Paweł
źródło
Upewnij się, że ustawiłeś DISPLAYzmienną środowiskową (najprawdopodobniej :0) przed uruchomieniem tego polecenia, w przeciwnym razie będzie narzekać.
palswim
3

Przyjęta odpowiedź jest rozwiązaniem specyficznym dla KDE5, bardziej ogólne podejście

loginctl list-sessions
loginctl terminate-session <id>

lub

loginctl terminate-user <username>

Źródło

Istnieje więcej możliwych poleceń:

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
źródło