Comment terminer correctement une session KDE à partir du shell sans privilèges root

17

J'accède à la machine (OpenSuse 11 avec KDE) via NX.

Je ne peux pas utiliser les raccourcis Alt-Ctrl-Del car ils sont capturés par mon système. Le bouton de déconnexion normal termine simplement la session NX sans terminer la session KDE. Je ne peux pas appeler kdm restartcar je n'ai pas de privilèges root.

D'autres suppositions sauvages aiment logoutet exitne fonctionnent pas non plus, la première se plaignant de ne pas être dans un shell de connexion et la seconde fermant simplement la console.

Mon shell-fu est faible, donc toute aide est appréciée.

kostja
la source
@ MartinSchröder - ah, bonne prise - c'est essentiellement la même question. Mais la réponse de Paul à cette question est plus exhaustive que la réponse de Gilles à l'autre.
kostja

Réponses:

30

Vous pouvez envoyer une commande de déconnexion via dbus à KDE, qui devrait (si possible) mettre fin à la session.

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

dbus est un système de messagerie qui permet aux applications de communiquer entre elles, et la qdbuscommande est un utilitaire pour envoyer des messages dbus aux applications.

Les applications s'enregistrent avec dbus, et la ksmserverpartie de KDE est le gestionnaire de session - il s'occupe de qui est connecté.

Nous envoyons donc un message à ksmserverl' /KSMServerinterface et lui demandons de se déconnecter. Le message que nous envoyons est exactement le même message qui est envoyé à KSM lorsque vous cliquez sur l'icône de déconnexion sur votre bureau.

Les trois zéros sont des paramètres et peuvent modifier le type de déconnexion que nous effectuons:

Premier paramètre:

  • 0 = N'attendez pas la confirmation
  • 1 = Attendre la confirmation (avec un délai de 30 secondes)

Deuxième paramètre:

  • -1 = Demande d'action, arrêt par défaut (n'a de sens qu'en attendant la confirmation.)
  • 0 = Déconnexion
  • 1 = redémarrer
  • 2 = arrêt

Le troisième paramètre est le paramètre "quand", mais son impact n'est pas clair.

Paul
la source
Assurez-vous de définir la DISPLAYvariable d'environnement (très probablement :0) avant d'exécuter cette commande, sinon elle se plaindra.
palswim
3

La réponse acceptée est une solution spécifique à KDE5, une approche plus générique serait

loginctl list-sessions
loginctl terminate-session <id>

ou

loginctl terminate-user <username>

La source

Il existe plus de commandes possibles:

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
la source