Exécuter le script sur l'écran verrouillé / déverrouillé

54

J'aimerais lancer un écran si la session Gnome est verrouillée et déverrouillée. Existe-t-il un moyen d'intercepter cela et d'effectuer certaines actions lorsque le poste de travail est verrouillé ou déverrouillé?

Naftuli Kay
la source

Réponses:

49

Gnome-screensaver émet des signaux sur dbus quand quelque chose se passe.

Ici la documentation (avec quelques exemples).

Vous pouvez écrire un script qui exécute:

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

et c’est ce dont vous avez besoin à tout moment, dbus-monitorune ligne indiquant que l’écran est verrouillé / déverrouillé.


Voici 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_LOCKEDet echo SCREEN_UNLOCKEDavec ce dont vous avez besoin.

peoro
la source
Bonjour @peoro, cela me fait penser que vous pouvez déverrouiller ou verrouiller l'écran / la session gnome à partir d'un programme scripté, cela en vaut la peine de faire quelques tours ssh à ce sujet ;-)
Nikhil Mulley le
1
@Nikhil: pour ce faire, vous n'avez pas besoin de jouer avec dbus: gnome-screensaver-commandc'est déjà là. En passant -aà, gnome-screensaver-commandvous verrouillez l'écran pendant que vous le déverrouillez avec -d. Quoi qu'il en soit, la plupart des applications gnome utilisent dbus de manière intensive, vous pourrez donc faire beaucoup de choses étonnantes avec.
peoro
1
@peoro Merci beaucoup, très utile! Puis-je aussi exécuter cela comme une sorte de démon? Quand j'entre ceci dans le terminal maintenant, il doit rester ouvert pour surveiller le dbus pour ce cas. Je souhaite exécuter cette commande lors de la connexion, puis elle peut être active pendant toute la session.
Sander
1
Je pense que les choses ont peut-être changé maintenant en 2014? comme la sortie ne change pas si l'écran était seulement verrouillé, il ne montre que quelque chose lorsqu'il est masqué et qu'il est très différent de celui-ci :(, j'ai créé cette question askubuntu.com/questions/505681/… , croyez-vous qu'il en reste encore thx!
Verseau Puissance
Comment exécuter ce script qui attrape l'événement de verrouillage? Un peu comme un observateur.
Starx
20

Dans Ubuntu 14.04, l’événement DBus pour le déverrouillage du verrouillage de l’écran a changé et le nouveau script de liaison aux événements de verrouillage et de déverrouillage de l’écran 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
)
Luv Agarwal
la source
idées sur la façon de faire ce travail sur Fedora 23?
Ray Foss
2
Fonctionne également bien le 16.04
Jacob Vlijm
@JacobVlijm Merci de tester cela et de l'éclairer au vert pour que je puisse l'utiliser ce soir :)
WinEunuuchs2Unix
6

De nos jours, je pense qu'il est préférable d'écouter les LockedHintmessages plutôt que les écrans de veille. 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 [])
Matthieu
la source
5

Ubuntu 16.04: La solution d'ozma n'a pas fonctionné pour moi, mais celle-ci a fonctionné:

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session,member=Unlocked" | 
  while read MSG; do
    LOCK_STAT=`echo $MSG | awk '{print $NF}'`
    if [[ "$LOCK_STAT" == "member=Unlocked" ]]; then
        echo "was unlocked"
    fi
  done
Artemy Tregubenko
la source
Cela pourrait fonctionner sur Unity mais la question concernait Gnome.
cprn
5

Développer la réponse déjà donnée.

Si vous essayez d'exécuter un script depuis une session screenou tmux, vous devez d'abord trouver le correct $DBUS_SESSION_BUS_ADDRESSet le transmettre comme argument pour dbus-monitorau lieu de --session. De même, si vous l'exécutez en tant que démon, vous devez vous assurer qu'une seule instance est en cours d'exécution à la fois (avec un fichier de verrouillage, par exemple) et que le script se nettoie après lui-même trap. L'exemple suivant fonctionnera comme un démon dans la plupart des environnements Gnome actuels (testé 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 les autres réponses pour une meilleure expression de veille DBus.
  2. vous exécutez plusieurs lignes DBus - vérifiez les détails pour rendre la recherche PID déterministe.
cprn
la source
1
Cela répond en fait à une question différente que je me posais pour découvrir de manière dynamique les informations de session DBus à partir d’un compte utilisateur, ce que j’ai résolu ici . Merci pour votre contribution ici!
Naftuli Kay
Merci. Je vais lier votre solution dans la réponse pour une lecture ultérieure.
cprn
4

Si vous êtes sur Kubuntu ou utilisez KDE / Plasma comme environnement de bureau, vous devez écouter l'interface org.freedesktop.ScreenSaverafin que le script permettant d'écouter cet événement se présente comme suit:

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
Bob
la source
1
Si vous utilisez KDE / plasma , vous pouvez utiliser les paramètres plasma de bureau pour exécuter des scripts sur les notifications ... Personalization>Notifications>Notifications>Screensaver.
Xenoid
merci @xenoid! KDE est tellement personnalisable que vous n’aurez jamais à jouer avec ces choses-là. c'est comme s'ils anticipaient ce dont j'avais besoin
Ankur S
0

upstart Prise en charge des travaux de la sessiondesktop-lock et desktop-unlockévénements en start onstrophe. Créez simplement un travail .conf pour votre utilisateur avec les déclencheurs et les commandes pertinents à appeler sous $XDG_CONFIG_HOME/upstart/ou $HOME/.config/upstartcomme exemple ci-dessous:

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

ce n'est peut-être pas la solution la plus propre, mais cela fonctionne pour moi quand dbus-monitor ...ne fonctionne pas:

gdbus monitor -y -d org.freedesktop.login1 |\
 grep --line-buffered -i "LockedHint" |\
 sed -uE 's/.*LockedHint.*<(.*)>.*/\1/g'

Doit renvoyer un flux de lignes avec des chaînes 'true' ou 'false'

Utilisation de: Fedora version 30 (trente)

utilisateur2777461
la source
semble être une extension de cette réponse
Jeff Schaller
-1

c'est ce qui a fonctionné pour moi dans 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
ozma
la source
Cela n'a pas fonctionné pour moi. Comme il a fini de s’exécuter et n’écoute pas l’état a changé.
Starx
quel économiseur d'écran utilisez-vous? gnome ou xscreensaver? quelle saveur ubuntu, xubuntu, kubuntu etc. quelle version (elle a été testée le 16.04)
ozma
Ubuntu Gnome 16.04
Starx