Script-Time: Auto-(Un-)Lock Laptop

Script-Time: Auto-(Un-)Lock Laptop
Photo by Mohammad Rahmani / Unsplash

Wäre es nicht angenehm, wenn der Rechner "unlocked" ist, solange man davor sitzt? Und wenn man den Raum verlässt wäre es gut, er wäre "locked" und der Bildschirm aus? Und wenn jetzt der Rechner noch aufpassen würde, falls jemand sich an meinen Arbeitsplatz setzt?

Ich habe das für mich mit einem Cronjob gelöst, der jede Minute meine Anwesenheit über die Erreichbarkeit meiner Uhr prüft. Ist sie nicht mehr zu sehen, wird der Rechner gesperrt und die Kamera angeschaltet. Bei Bewegung vor der Kamera bekomme ich ein Bild davon auf die Uhr.

Damit das Script den Bildschirm sperren kann, muss es mit Root-Rechten laufen. Dann kann es aber leider nicht den Bildschirm eines Benutzers ausschalten. Um dieses Problem zu lösen muss der Nutzer, der von dem Script profitieren möchte, mit seinem Account folgenden Befehl ausführen, um root zu erlauben den Bildschirm auszuschalten:

xhost +SI:localuser:root

Dann ist die Änderung aber leider nicht persistent. Damit die Einstellungen auch einen Reboot überleben, sollte man den Befehl in der ~/.xprofile eintragen:

echo "xhost +SI:localuser:root" > ~/.xprofile
chmod +x ~/.xprofile

Dann dieses Script ausführbar machen:

#!/bin/bash

# Use a Flag, so other tools can also use this info
FLAG=/tmp/present.flag
# You might want to use your phone instead:
WATCHMAC=12:34:56:78:90:ab

hciconfig hci0 up

# Try 10 times to reduce false positives
if ( l2ping -c 10 -t 2 $WATCHMAC > /dev/null 2>&1)
    then
        if [ ! -e $FLAG ]
             then 
                echo "MM in der Nähe" > $FLAG
                export DISPLAY=:0 
                xset dpms force on
                killall motion
                loginctl unlock-sessions
        fi
    else
        if [ -e $FLAG ]
            then 
                loginctl lock-sessions
                sleep 2
                export DISPLAY=:0 
                xset dpms force off
                motion
                rm $FLAG
        fi
fi

... und via cron minütlich aufrufen. In der motion.conf kann man dann u.A. auch die Benachrichtigung einrichten. Ich habe da einen Shellbefehl hinterlegt, der in etwa so aussieht:

curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" -d "chat_id=${CHAT_ID}&text=${MESSAGE}"

Wenn ich jetzt an meinen Rechner zurück komme, öffnet er alle Bildschirme nur für mich...