Komut dosyasını ekran kilidinde çalıştır / kilidini aç


54

Gnome oturumu kilitlenmiş ve kilidi açılmışsa bir ekran çalıştırmak istiyorum. Masaüstü kilitlendiğinde veya kilidi açıldığında bunu engelleyebileceğim ve belirli işlemler yapabileceğim bir yol var mı?

Yanıtlar:


49

GNOME ekran koruyucu bir şey olduğunda dbus'ta bazı sinyaller yayar.

İşte belgeler (bazı örneklerle).

Çalışan bir komut dosyası yazabilirsiniz:

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

ve ihtiyacınız olanı yaparsanız dbus-monitor, kilitlenen / kilidi açılan ekran hakkında bir çizgi basar.


İhtiyacınız olanı yapmak için burada bir bash komutu:

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

Sadece yerine echo SCREEN_LOCKEDve echo SCREEN_UNLOCKEDgerekenler ile.


Merhaba @peoro, Bu komut dosyasıyla bir programdan gnome ekranı / oturumu açabileceğinizi veya kilitleyebileceğinizi düşündürüyor, bu konuda bazı ssh hileleri yapmaya değer ;-)
Nikhil Mulley

1
@Nikhil: dbus ile oynamanıza gerek kalmaması için: gnome-screensaver-commandzaten orada. Geçme -aiçin gnome-screensaver-commandsizinle kilidini açacağız satarken, Ekranı kilitlemek edeceğiz -d. Her neyse, çoğu cüce uygulaması dbus'ı yaygın olarak kullanıyor, böylece onunla çok şaşırtıcı şeyler yapabilirsiniz.
peoro

1
@peoro Teşekkürler harika, çok yardımcı! Bunu bir çeşit daemon olarak da çalıştırabilir miyim? Şimdi terminale girdiğimde, bu durumda dbus'ı izlemek için açık kalmam gerekiyor. Giriş sırasında bu komutu çalıştırmak istiyorum ve daha sonra tüm oturum boyunca aktif olabilir.
Sander

1
Sanırım 2014'te işler değişmiş olabilir? ekranın sadece kilitlenmiş olması durumunda çıktı değişmediği için, sadece boşaldığında bir şey gösterir ve buradan çok farklıdır :(, ben bu soruyu yarattım askubuntu.com/questions/505681/… , hala bazı olduğuna inanıyor musunuz? Bunu yapmanın yolu? thx!
Kova Gücü

Lock olayı yakalayan senaryo nasıl çalıştırılır? Bir izleyici gibiydi.
Starx

20

Ubuntu 14.04'te, ekran kilidi kilidinin açılması için DBus etkinliği değişmiştir ve ekran kilidinin açılması ve kilidinin açılması için yeni komut aşağıdaki gibidir.

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
)

Bu çalışma nasıl fedora 23 üzerinde yapılacak hakkında fikir?
Ray Foss


@JacobVlijm Bunu test ettiğiniz ve bu gece kullanmam için yeşil aydınlattığı için teşekkürler :)
WinEunuuchs2Unix

6

Bugünlerde LockedHintekran koruyucu mesajları yerine dinlemenin daha iyi olacağını düşünüyorum . Bu şekilde bir ekran koruyucu uygulamasına bağlı değilsiniz.

İşte bunu yapmak için basit bir komut dosyası:

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

Bunu verir:

/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: ozma'nın çözümü benim için işe yaramadı, ancak bu yaptı:

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

Birlik üzerinde çalışabilir, ancak soru Gnome ile ilgiliydi.
cprn

5

Zaten verilen cevap genişleyerek.

Bir komut dosyasını bir screenveya tmuxoturumun içinden çalıştırmayı denerseniz , önce doğru olanı bulmanız $DBUS_SESSION_BUS_ADDRESSve dbus-monitorbunun yerine bir argüman olarak geçirmeniz gerekir --session. Ayrıca bir arka plan programı olarak çalıştırıyorsanız, bir kerede yalnızca bir örneğin çalıştığından (örn. Bir kilit dosyasıyla) ve komut dosyasının kendisinden sonra temizlediğinden emin olmalısınız trap. Aşağıdaki örnek, en güncel Gnome ortamlarında (- Ubuntu GNOME 16.04'te test edilmiştir) daemon olarak çalışacaktır:

#!/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)

Bu sizin için işe yaramazsa, muhtemelen çünkü:

  1. Gnome kullanmazsınız - daha iyi DBus saat ifadesi için diğer cevapları kontrol edin.
  2. Birden fazla DBus satırı çalıştırıyorsanız , PID bulmanın nasıl deterministik hale getirileceğine ilişkin ayrıntıları kontrol edin .

1
Bu aslında, burada çözdüğüm bir kullanıcı hesabı verilen DBus oturum bilgilerini dinamik olarak keşfetmek için sahip olduğum farklı bir soruyu yanıtlıyor . Buradaki katkınız için teşekkürler!
Naftuli Kay

Teşekkürler. Daha fazla okumak için çözümünüzü cevabınızla ilişkilendireceğim.
cprn

4

Kubuntu'daysanız veya Masaüstü Ortamınız olarak KDE / Plazma kullanıyorsanız, arayüzü dinlemek zorundasınız org.freedesktop.ScreenSaver, böylece o olayı dinlemek için kullanılan komut dosyası şöyle görünecektir:

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
Eğer KDE / Plazma kullanırsanız ... bildirimleri komut dosyalarını yürütmek için Plazma Masaüstü ayarlarını kullanabilirsiniz Personalization>Notifications>Notifications>Screensaver.
xenoid

teşekkürler @ xenoid! KDE, kişiselleştirilebilir bir şeydir, böyle şeylerle uğraşmak zorunda kalmazsınız. sanırım ihtiyacım olanı tahmin ediyorlar
Ankur S

0

upstart oturum iş destek desktop-lockve stanza desktop-unlockolayları start on. Kullanıcınız için aşağıdaki örnek altında $XDG_CONFIG_HOME/upstart/veya $HOME/.config/upstartbenzeri bir şekilde çağırması gereken ilgili tetikleyiciler ve komutlarla bir iş .conf oluşturun :

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

-1

bu benim için çalıştı ubuntu'da çalıştı 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

Bu benim için işe yaramadı. Yürütülmesi bitince ve durumu dinlemiyor gibi değişti.
Starx

hangi ekran koruyucuyu kullanıyorsunuz GNOME veya Xscreensaver? hangi lezzet ubuntu, xubuntu, kubuntu vs. hangi versiyon (
16.04'te

ubuntu gnome 16.04
Starx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.