Führen Sie das Skript auf dem Bildschirm zum Sperren / Entsperren aus

54

Ich möchte einen Bildschirm ausführen, wenn die Gnome-Sitzung gesperrt und entsperrt ist. Gibt es eine Möglichkeit, dies abzufangen und bestimmte Aktionen auszuführen, wenn der Desktop gesperrt oder entsperrt ist?

Naftuli Kay
quelle

Antworten:

49

Gnome-Bildschirmschoner sendet einige Signale auf dbus, wenn etwas passiert.

Hier die Dokumentation (mit einigen Beispielen).

Sie könnten ein Skript schreiben, das ausgeführt wird:

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

und das tut was Sie brauchen, wenn Sie dbus-monitoreine Zeile über den Bildschirm drucken, der gesperrt / entsperrt wird.


Hier ein Bash-Befehl, um das zu tun, was Sie brauchen:

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

Ersetzen Sie einfach echo SCREEN_LOCKEDund echo SCREEN_UNLOCKEDmit dem, was Sie brauchen.

peoro
quelle
Hi @peoro, Das lässt mich denken, dass Sie Gnome-Bildschirm / Sitzung von einem Skriptprogramm entsperren oder sperren können, es lohnt sich, ein paar ssh-Tricks zu machen ;-)
Nikhil Mulley
1
@Nikhil: um das zu tun musst du nicht mit dbus rumspielen: gnome-screensaver-commandist schon da. Übergeben -aan gnome-screensaver-command, sperren Sie den Bildschirm, während Sie ihn mit entsperren -d. Wie auch immer, die meisten Gnome-Apps verwenden Dbus ausgiebig, sodass Sie viele erstaunliche Dinge damit tun können.
Peoro
1
@peoro Danke super, sehr hilfreich! Kann ich dies auch als eine Art Daemon ausführen? Wenn ich dies jetzt im Terminal eingebe, muss es geöffnet bleiben, um den dbus für diesen Fall zu überwachen. Ich möchte diesen Befehl bei der Anmeldung ausführen und dann kann er während der gesamten Sitzung aktiv sein.
Sander
1
Ich denke, die Dinge könnten sich jetzt im Jahr 2014 geändert haben? Da sich die Ausgabe nicht ändert, wenn der Bildschirm nur gesperrt war, zeigt sie nur etwas, wenn er ausgeblendet wird, und unterscheidet sich sehr von hier :(, ich habe diese Frage erstellt. askubuntu.com/questions/505681/… , glauben Sie, dass es noch einige gibt Weg, um das zu tun? thx!
Aquarius Power
Wie führe ich das Skript aus, das das Sperrereignis abfängt? Ein bisschen wie ein Beobachter.
Starx
20

In Ubuntu 14.04 wurde das DBus-Ereignis zum Entsperren des Bildschirms geändert und das neue Skript zum Binden an Ereignisse zum Sperren und Entsperren des Bildschirms sieht folgendermaßen aus

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
quelle
Ideen, wie man diese Arbeit auf Fedora 23 machen kann?
Ray Foss
2
Funktioniert auch am 16.04.
Jacob Vlijm 29.11.16
@JacobVlijm Danke, dass du dies getestet und grün beleuchtet hast, damit ich es heute Abend verwenden kann :)
WinEunuuchs2Unix
6

Heutzutage ist es meiner Meinung nach besser, die LockedHintNachrichten anzuhören, als Bildschirmschoner-Nachrichten. Auf diese Weise sind Sie nicht an eine Bildschirmschoner-Implementierung gebunden.

Hier ist ein einfaches Skript, um das zu tun:

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

Gibt dies:

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

Ubuntu 16.04: Die Lösung von ozma hat bei mir nicht funktioniert, diesmal jedoch:

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
quelle
Es könnte auf Unity funktionieren, aber die Frage bezog sich auf Gnome.
1.
5

Erweitere die bereits gegebene Antwort.

Wenn Sie versuchen, ein Skript aus einer screenoder einer tmuxSitzung heraus auszuführen , müssen Sie $DBUS_SESSION_BUS_ADDRESSzuerst das richtige Skript finden und es als Argument für dbus-monitoranstatt übergeben --session. Auch wenn Sie es als Daemon ausführen, sollten Sie sicherstellen, dass jeweils nur eine Instanz ausgeführt wird (z. B. mit einer Sperrdatei) und dass das Skript nach sich selbst mit bereinigt trap. Das folgende Beispiel funktioniert als Daemon in den meisten aktuellen Gnome-Umgebungen (getestet unter 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)

Wenn dies bei Ihnen nicht funktioniert, liegt es wahrscheinlich an:

  1. Sie verwenden Gnome nicht - überprüfen Sie andere Antworten, um einen besseren Ausdruck für die DBus-Überwachung zu erhalten.
  2. Sie laufen mehrere DBus Linien - überprüfen Details darüber , wie PID finden deterministisch zu machen.
cprn
quelle
1
Dies beantwortet tatsächlich eine andere Frage, die ich zum dynamischen Ermitteln der DBus-Sitzungsinformationen bei einem Benutzerkonto hatte und die ich hier gelöst habe . Vielen Dank für Ihren Beitrag hier!
Naftuli Kay
Vielen Dank. Ich werde Ihre Lösung in der Antwort zur weiteren Lektüre verlinken.
cprn
4

Wenn Sie auf Kubuntu arbeiten oder KDE / Plasma als Desktop-Umgebung verwenden, müssen Sie auf die Benutzeroberfläche org.freedesktop.ScreenSaverachten, damit das Skript zum Abhören dieses Ereignisses folgendermaßen aussieht:

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
quelle
1
Wenn Sie KDE / Plasma verwenden, können Sie in den Plasma Desktop-Einstellungen Skripts für Benachrichtigungen ausführen Personalization>Notifications>Notifications>Screensaver.
Xenoid
danke @xenoid! KDE ist so personalisierbar, dass Sie nie mit diesen Dingen herumspielen müssen. Es ist, als ob sie vorwegnehmen, was ich brauche
Ankur S
0

upstart Unterstützung des Sitzungsjobsdesktop-lock und desktop-unlockEreignisse in der start onZeilengruppe. Erstellen Sie einfach einen Job Conf für Ihre Benutzer mit den entsprechenden Trigger und Befehle unter anrufen $XDG_CONFIG_HOME/upstart/oder $HOME/.config/upstartunten , wie zB:

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

Das hat bei mir in Ubuntu 16.04 funktioniert

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
quelle
Das hat bei mir nicht funktioniert. Als es fertig ausgeführt und hört nicht auf den Status geändert.
Starx
Welchen Bildschirmschoner verwenden Sie? gnome oder xscreensaver? welches geschmack ubuntu, xubuntu, kubuntu etc. welche version (es wurde am 16.04 getestet)
ozma
Ubuntu Gnome 16.04
Starx