Jalankan skrip pada kunci layar / buka kunci

54

Saya ingin menjalankan layar jika sesi Gnome terkunci dan tidak terkunci. Apakah ada cara saya dapat mencegat ini dan melakukan tindakan tertentu ketika desktop terkunci atau tidak terkunci?

Naftuli Kay
sumber

Jawaban:

49

Gnome-screensaver memancarkan beberapa sinyal pada dbus ketika sesuatu terjadi.

Berikut dokumentasi (dengan beberapa contoh).

Anda dapat menulis skrip yang berjalan:

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

dan itu melakukan apa yang Anda butuhkan kapan saja dbus-monitormencetak garis tentang layar sedang dikunci / dibuka.


Di sini perintah bash untuk melakukan apa yang Anda butuhkan:

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

Ganti saja echo SCREEN_LOCKEDdan echo SCREEN_UNLOCKEDdengan apa yang Anda butuhkan.

peoro
sumber
Hai @peoro, Itu membuat saya berpikir Anda dapat membuka atau mengunci layar gnome / sesi dari program scripted, layak melakukan beberapa trik ssh tentang hal itu ;-)
Nikhil Mulley
1
@ Nikhil: untuk melakukan itu kamu tidak perlu bermain-main dengan dbus: gnome-screensaver-commandsudah ada di sana. Melewati -ake gnome-screensaver-commandAnda akan mengunci layar, sementara Anda akan membukanya dengan -d. Bagaimanapun, sebagian besar aplikasi gnome menggunakan dbus secara luas, sehingga Anda dapat melakukan banyak hal menakjubkan dengannya.
peoro
1
@peoro Terima kasih, sangat membantu! Bisakah saya menjalankan ini sebagai semacam daemon? Ketika saya memasukkan ini di terminal sekarang, ia harus tetap terbuka untuk memantau dbus untuk kasus itu. Saya ingin menjalankan perintah ini saat login dan kemudian dapat aktif selama seluruh sesi.
Sander
1
Saya pikir hal-hal mungkin telah berubah sekarang di tahun 2014? karena output tidak berubah jika layar hanya dikunci, itu hanya menunjukkan sesuatu ketika menjadi kosong dan sangat berbeda dari sini :(, saya membuat pertanyaan ini askubuntu.com/questions/505681/… , apakah Anda yakin masih ada beberapa cara untuk melakukan itu? thx!
Aquarius Power
Bagaimana menjalankan skrip yang menangkap peristiwa kunci? Agak seperti seorang pengamat.
Starx
20

Di ubuntu 14.04 acara DBus untuk membuka kunci layar telah berubah dan skrip baru untuk mengikat ke kunci layar dan membuka kunci acara tampak seperti berikut

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
sumber
ide tentang bagaimana membuat ini bekerja di fedora 23?
Ray Foss
2
Berfungsi dengan baik pada 16,04 juga
Jacob Vlijm
@JacobVlijm Terima kasih telah menguji ini dan menyalakannya untuk saya gunakan malam ini :)
WinEunuuchs2Unix
6

Saat ini saya pikir lebih baik mendengarkan LockedHintpesan daripada screensaver. Dengan begitu Anda tidak terikat dengan implementasi screensaver.

Berikut ini skrip sederhana untuk melakukannya:

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

Memberi ini:

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

Ubuntu 16.04: solusi ozma tidak bekerja untuk saya, namun yang ini berhasil:

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
sumber
Mungkin berhasil pada Unity tetapi pertanyaannya adalah mengenai Gnome.
cprn
5

Memperluas jawaban yang sudah diberikan.

Jika Anda mencoba menjalankan skrip dari dalam sesi screenatau tmux, Anda harus menemukan yang benar $DBUS_SESSION_BUS_ADDRESSterlebih dahulu dan meneruskannya sebagai argumen untuk dbus-monitorbukan --session. Juga jika Anda menjalankannya sebagai daemon, Anda harus memastikan hanya satu instance yang berjalan pada satu waktu (misalnya dengan file kunci) dan bahwa skrip membersihkan setelah itu dengan trap. Contoh berikut akan berfungsi sebagai daemon di sebagian besar lingkungan Gnome saat ini (diuji pada 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)

Jika ini tidak berhasil untuk Anda, mungkin karena:

  1. Anda tidak menggunakan Gnome - periksa jawaban lain untuk ekspresi menonton DBus yang lebih baik.
  2. Anda menjalankan beberapa baris DBus - periksa detail tentang cara membuat PID menemukan deterministik.
cprn
sumber
1
Ini sebenarnya menjawab pertanyaan berbeda yang saya miliki untuk secara dinamis menemukan informasi sesi DBus yang diberikan akun pengguna, yang telah saya selesaikan di sini . Terima kasih atas kontribusi Anda di sini!
Naftuli Kay
Terima kasih. Saya akan menautkan solusi Anda dalam jawaban untuk bacaan lebih lanjut.
cprn
4

Jika Anda menggunakan Kubuntu atau menggunakan KDE / Plasma sebagai Lingkungan Desktop Anda, Anda harus mendengarkan antarmuka org.freedesktop.ScreenSaver, sehingga skrip untuk mendengarkan acara tersebut akan terlihat seperti ini:

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
sumber
1
Jika Anda menggunakan KDE / Plasma Anda dapat menggunakan pengaturan Plasma Desktop untuk mengeksekusi script pada pemberitahuan ... Personalization>Notifications>Notifications>Screensaver.
xenoid
terima kasih @xenoid! KDE adalah hal yang dapat disesuaikan secara personal sehingga Anda tidak perlu mempermasalahkan hal-hal ini. itu seolah-olah mereka mengantisipasi apa yang saya butuhkan
Ankur S
0

upstart dukungan sesi pekerjaandesktop-lock dan desktop-unlockacara dalam start onbait. Cukup buat pekerjaan .conf untuk pengguna Anda dengan pemicu dan perintah yang relevan untuk dipanggil di bawah $XDG_CONFIG_HOME/upstart/atau $HOME/.config/upstartseperti contoh di bawah ini:

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

inilah yang bekerja untuk saya di 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
sumber
Ini tidak berhasil untuk saya. Saat selesai dieksekusi dan tidak mendengarkan negara berubah.
Starx
screensaver mana yang Anda gunakan? gnome atau xscreensaver? mana rasa ubuntu, xubuntu, kubuntu dll. versi mana (itu diuji pada 16.04)
ozma
ubuntu gnome 16.04
Starx