web-dev-qa-db-fra.com

Exécuter le script sur l'écran Verrouillage / Déverrouiller

Je voudrais exécuter un écran si la session Gnome est verrouillée et déverrouillée. Y a-t-il une façon de pouvoir intercepter cela et d'effectuer certaines actions lorsque le bureau est verrouillé ou déverrouillé?

59
Naftuli Kay

Gnome-Screensaver émet des signaux sur les DBU lorsque quelque chose se passe.

ICI la documentation (avec quelques exemples).

Vous pouvez écrire un script qui fonctionne:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"

et cela fait ce que vous avez besoin à tout moment dbus-monitor Imprime une ligne sur l'écran en cours d'étant verrouillée/déverrouillée.


Ici, une commande bash pour faire ce dont vous avez besoin:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
  while read x; do
    case "$x" in 
      *"boolean true"*) echo SCREEN_LOCKED;;
      *"boolean false"*) echo SCREEN_UNLOCKED;;  
    esac
  done

Il suffit de remplacer echo SCREEN_LOCKED et echo SCREEN_UNLOCKED Avec ce dont vous avez besoin.

55
peoro

Dans Ubuntu 14.04, l'événement DBUS pour le déverrouillage de Screen Lock a changé et le nouveau script pour la liaison à l'écran de verrouillage et de déverrouillage des événements ressemble à ce qui suit.

dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
  while true; do
    read X
    if echo $X | grep "desktop-lock" &> /dev/null; then
      SCREEN_LOCKED;
    Elif echo $X | grep "desktop-unlock" &> /dev/null; then
      SCREEN_UNLOCKED;
    fi
  done
)
21
Luv Agarwal

De nos jours, je pense qu'il est préférable d'écouter les messages LockedHint plutôt que des messages d'économiseur d'écran. De cette façon, vous n'êtes pas lié à une implémentation d'économiseur d'écran.

Voici un script simple pour le faire:

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint

Donne ceci:

/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
6
Matthew

Si vous êtes sur Kubuntu ou en utilisant KDE/Plasma comme environnement de bureau, vous devez écouter l'interface org.freedesktop.ScreenSaver, le script d'écoute de cet événement ressemblerait à ceci:

dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
  while read x; do
    case "$x" in 
      *"boolean true"*) echo SCREEN_LOCKED;;
      *"boolean false"*) echo SCREEN_UNLOCKED;;  
    esac
  done
5
Bob

Expansion sur une réponse déjà donnée.

Si vous essayez d'exécuter un script de l'intérieur d'une screen ou tmux session, vous devrez trouver le bon $DBUS_SESSION_BUS_ADDRESS d'abord et transmettez-le comme un argument pour dbus-monitor à la place de --session. De plus, si vous l'exécutez comme un démon, vous devez vous assurer qu'une seule instance est en cours d'exécution à la fois (par exemple, avec un fichier de verrouillage) et que le script se nettoie après elle-même avec trap. L'exemple suivant fonctionnera comme un démon dans la plupart des environnements de gnome actuels (testés sur Ubuntu Gnome 16.04):

#!/bin/bash
set -o nounset                # good practice, exit if unset variable used

pidfile=/tmp/lastauth.pid     # lock file path
logfile=/tmp/lastauth.log     # log file path

cleanup() {                   # when cleaning up:
    rm -f $pidfile            # * remove the lock file
    trap - INT TERM EXIT      # * reset kernel signal catching
    exit                      # * stop the daemon
}

log() {                       # simple logging format example
    echo $(date +%Y-%m-%d\ %X) -- $USER -- "$@" >> $logfile
}

if [ -e "$pidfile" ]; then    # if lock file exists, exit
    log $0 already running...
    exit
fi

trap cleanup INT TERM EXIT    # call cleanup() if e.g. killed

log daemon started...

echo $$ > $pidfile            # create lock file with own PID inside

# usually `dbus-daemon` address can be guessed (`-s` returns 1st PID found)
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s dbus-daemon)/environ)

expr='type=signal,interface=org.gnome.ScreenSaver' # DBus watch expression here

dbus-monitor --address $DBUS_SESSION_BUS_ADDRESS "$expr" | \ 
    while read line; do
        case "$line" in
            *"boolean true"*) log session locked;;
            *"boolean false"*) log session unlocked;;
        esac
    done

cleanup # let's not leave orphaned lock file when the loop ends (e.g. dbus dies)

Si cela ne fonctionne pas pour vous, c'est probablement parce que:

  1. vous n'utilisez pas GNOME - Vérifiez d'autres réponses pour une meilleure expression de montre DBUS.
  2. vous exécutez plusieurs lignes DBus - chèque détails sur la manière de faire de la recherche de PID déterministe.
5
cprn

Où écrire ce code et comment il fonctionnera:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
  while read x; do
    case "$x" in 
      *"boolean true"*) echo SCREEN_LOCKED;;
      *"boolean false"*) echo SCREEN_UNLOCKED;;  
    esac
  done
0
Shrawan Lal

Pour KDE plasma, nous pouvons écouter org.freedesktop.ScreenSaver avec:

dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'"

Mais notez que les actions de verrouillage/déverrouillage sont rapportées deux fois, le script suivant limite l'action dans les 5 secondes (pour éviter d'exécuter la commande requise deux fois).

#!/bin/bash

screen_locked () {
    if [[ $firstrun == '' ]] || [[ $(expr $(date +%s) - $firstrun) -ge 5 ]]
    then
        screen_locked_core;
        firstrun=$(date +%s);
    fi
}

screen_locked_core () {
    echo locked
}

dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
while read x; do
    case "$x" in 
        *"boolean true"*) screen_locked;;
#       *"boolean false"*) screen_unlocked;;  
    esac
done
0
intika

Version pour Cinnamon Desktop (Ubuntu 18.04):

dbus-monitor --session "type='signal',interface='org.cinnamon.ScreenSaver'" | \
(
  while true; do
    read X
    if echo $X | grep "boolean true" &> /dev/null; then
      echo `date` - SCREEN_LOCKED;
    Elif echo $X | grep "boolean false" &> /dev/null; then
      echo `date` - SCREEN_UNLOCKED;
    fi
  done
)
0
BloodBlight

Merci pour Hatertot Commenter une autre version. Testé sur Ubuntu 18.04

echo "start at `date`" >> ~/Documents/time-trecking.log
dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" | 
  while read MSG; do
    LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
    if [[ "$LOCK_STAT" == "true" ]]; then
        echo "locked `date +%s` `date`" >> ~/Documents/time-trecking.log
    Elif [[ "$LOCK_STAT" == "false" ]]; then
        echo "unlock `date +%s` `date`" >> ~/Documents/time-trecking.log
    fi
  done

[Avant de modifier] C'est ce qui a fonctionné pour moi à Ubuntu 16.04

dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" | 
  while read MSG; do
    LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
    if [[ "$LOCK_STAT" == "true" ]]; then
        echo "was locked"
    else
        echo "was un-locked"
    fi
  done
0
ozma

upstarttravail de session Support desktop-lock et desktop-unlock événements dans start on Stanza. Créez simplement un emploi .Conf pour votre utilisateur avec des déclencheurs et des commandes pertinentes à appeler sous $XDG_CONFIG_HOME/upstart/ ou $HOME/.config/upstart Comme exemple ci-dessous:

description "some job description"
start on desktop-lock
script
        /path/to/your/executable
end script
0
Oleg V. Volkov