Ejecutar script en bloqueo / desbloqueo de pantalla


54

Me gustaría ejecutar una pantalla si la sesión de Gnome está bloqueada y desbloqueada. ¿Hay alguna manera de que pueda interceptar esto y realizar ciertas acciones cuando el escritorio está bloqueado o desbloqueado?

Respuestas:


49

Gnome-screensaver emite algunas señales en dbus cuando sucede algo.

Aquí la documentación (con algunos ejemplos).

Podrías escribir un script que se ejecute:

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

y eso hace lo que necesita en cualquier momento dbus-monitorimprime una línea sobre la pantalla bloqueada / desbloqueada.


Aquí un comando bash para hacer lo que necesitas:

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

Simplemente reemplace echo SCREEN_LOCKEDy echo SCREEN_UNLOCKEDcon lo que necesita.


Hola @peoro, eso me hace pensar que puedes desbloquear o bloquear la pantalla / sesión de gnomo desde un programa con script, vale la pena hacer algunos trucos ssh al respecto ;-)
Nikhil Mulley

1
@Nikhil: para hacer eso no necesitas jugar con dbus: gnome-screensaver-commandya está ahí. Pasando -aa gnome-screensaver-commandque va a bloquear la pantalla, mientras que podrás desbloquear con -d. De todos modos, la mayoría de las aplicaciones gnome usan dbus ampliamente, por lo que podrás hacer muchas cosas increíbles con él.
peoro

1
@peoro Gracias genial, muy útil! ¿Puedo ejecutar esto también como una especie de demonio? Cuando ingreso esto en la terminal ahora, tiene que permanecer abierto para monitorear el dbus para ese caso. Me gustaría ejecutar este comando al iniciar sesión y luego puede estar activo durante toda la sesión.
Sander

1
¿Creo que las cosas pueden haber cambiado ahora en 2014? como la salida no cambia si la pantalla solo estaba bloqueada, solo muestra algo cuando queda en blanco y es muy diferente de aquí :(, creé esta pregunta askubuntu.com/questions/505681/… , ¿crees que todavía hay algo manera de hacer eso? gracias!
Acuario de energía

¿Cómo ejecutar ese script que atrapa el evento de bloqueo? Un poco como un observador.
Starx

20

En ubuntu 14.04, el evento DBus para el desbloqueo de bloqueo de pantalla ha cambiado y el nuevo script para vincular los eventos de bloqueo de pantalla y desbloqueo se ve de la siguiente manera

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
)

ideas sobre cómo hacer que esto funcione en fedora 23?
Ray Foss el

2
También funciona bien en 16.04
Jacob Vlijm

@JacobVlijm Gracias por probar esto y darme luz verde para que lo use esta noche :)
WinEunuuchs2Unix

6

Hoy en día creo que es mejor escuchar los LockedHintmensajes que el protector de pantalla. De esa manera no estás atado a una implementación de protector de pantalla.

Aquí hay un script simple para hacer eso:

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

Da esto:

/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 [])

5

Ubuntu 16.04: la solución de ozma no funcionó para mí, sin embargo, esta sí:

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

Podría funcionar en Unity, pero la pregunta era con respecto a Gnome.
cprn

5

Ampliando en respuesta ya dada.

Si intenta ejecutar un script desde dentro de una sesión screeno tmux, $DBUS_SESSION_BUS_ADDRESSprimero deberá encontrar el correcto y pasarlo como un argumento en dbus-monitorlugar de hacerlo --session. Además, si lo está ejecutando como demonio, debe asegurarse de que solo se ejecute una instancia a la vez (por ejemplo, con un archivo de bloqueo) y de que el script se limpia después de sí mismo trap. El siguiente ejemplo funcionará como un demonio en la mayoría de los entornos Gnome actuales (probado en 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 esto no funciona para usted, probablemente sea porque:

  1. no usas Gnome - verifica otras respuestas para una mejor expresión de reloj DBus.
  2. ejecuta múltiples líneas DBus: verifique los detalles sobre cómo hacer que la búsqueda de PID sea determinista.

1
Esto realmente responde a una pregunta diferente que tenía para descubrir dinámicamente la información de sesión DBus dada una cuenta de usuario, que he resuelto aquí . ¡Gracias por tu contribución aquí!
Naftuli Kay

Gracias. Vincularé su solución en la respuesta para leer más.
cprn

4

Si está en Kubuntu o está usando KDE / Plasma como su entorno de escritorio, debe escuchar la interfaz org.freedesktop.ScreenSaver, por lo que el script para escuchar ese evento se vería así:

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

1
Si utiliza KDE / plasma se puede utilizar la configuración de escritorio Plasma de ejecutar secuencias de comandos en las notificaciones ... Personalization>Notifications>Notifications>Screensaver.
xenoid

gracias @xenoid! KDE es un dispositivo tan personalizable que nunca tendrá que jugar con estas cosas. es como si anticiparan lo que necesito
Ankur S

0

upstart sesión de trabajo de apoyo desktop-locky desktop-unlockeventos en start onstanza. Simplemente cree un trabajo .conf para su usuario con activadores y comandos relevantes para llamar debajo $XDG_CONFIG_HOME/upstart/o $HOME/.config/upstartcomo ejemplo a continuación:

description "some job description"
start on desktop-lock
script
        /path/to/your/executable
end script

-1

Esto es lo que funcionó para mí en 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

Esto no funcionó para mí. Como terminó de ejecutarse y no escucha el estado cambió.
Starx

¿Qué protector de pantalla estás usando? gnome o xscreensaver? que ubuntu sabor, xubuntu, kubuntu etc. qué versión (que fue probado en 16.04)
ozma

ubuntu gnome 16.04
Starx
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.