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é?
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é?
Réponses:
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.
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.
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
)
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 [])
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
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:
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
Personalization>Notifications>Notifications>Screensaver.
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
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)
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