Cara mengakhiri sesi KDE dengan benar dari shell tanpa root privilege

17

Saya mengakses mesin (OpenSuse 11 dengan KDE) melalui NX.

Saya tidak dapat menggunakan pintasan Alt-Ctrl-Del seperti yang ditangkap oleh sistem saya. Tombol logoff reguler hanya mengakhiri sesi NX tanpa mengakhiri sesi KDE. Saya tidak bisa menelepon kdm restartkarena saya tidak memiliki hak root.

Tebakan liar lain seperti logoutdan exitjuga tidak berfungsi, yang pertama mengeluh tentang tidak berada di shell login dan yang kedua hanya menutup konsol.

Shell-fu saya lemah, jadi bantuan apa pun dihargai.

kostja
sumber
@ MartinSchröder - ah, tangkapan bagus - pada dasarnya pertanyaan yang sama. Tapi jawaban Paul untuk pertanyaan ini lebih lengkap daripada jawaban Gilles untuk yang lain.
kostja

Jawaban:

30

Anda dapat mengirim perintah logout melalui dbus ke KDE, yang seharusnya (jika bisa) mengakhiri sesi.

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

dbus adalah sistem pesan yang memungkinkan aplikasi berkomunikasi satu sama lain, dan qdbusperintahnya adalah utilitas untuk mengirim pesan dbus ke aplikasi.

Aplikasi mendaftar dengan dbus, dan ksmserverbagian dari KDE adalah manajer sesi - ini mencari siapa yang masuk.

Jadi kita mengirim pesan ke ksmserverke /KSMServerantarmuka dan mengatakan hal itu untuk logout. Pesan yang kami kirim adalah pesan yang sama persis dengan yang dikirim ke KSM ketika Anda mengklik ikon logout di desktop Anda.

Tiga nol adalah parameter dan dapat mengubah jenis logout yang kami lakukan:

Parameter pertama:

  • 0 = Jangan menunggu konfirmasi
  • 1 = Tunggu konfirmasi (dengan batas waktu 30 detik)

Parameter kedua:

  • -1 = Prompt untuk tindakan, default ke shutdown (Hanya masuk akal ketika menunggu konfirmasi.)
  • 0 = Keluar
  • 1 = Mulai ulang
  • 2 = Shutdown

Parameter ketiga adalah parameter "kapan", tetapi tidak jelas apa dampaknya.

Paul
sumber
Pastikan untuk mengatur DISPLAYvariabel lingkungan (kemungkinan besar :0) sebelum Anda menjalankan perintah ini, jika tidak maka akan mengeluh.
palswim
3

Jawaban yang diterima adalah solusi khusus untuk KDE5, pendekatan yang lebih umum

loginctl list-sessions
loginctl terminate-session <id>

atau

loginctl terminate-user <username>

Sumber

Ada lebih banyak perintah yang mungkin:

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
sumber