喚醒後以程式設計方式登入

喚醒後以程式設計方式登入

我的場景是,我希望rtcwake -m no在我睡覺時喚醒我的計算機,並使用systemd/systemd-suspend腳本觸發smplayer以播客隊列喚醒我。

我的困難是smplayer無法在喚醒時運行,因為 Ubuntu 加載登入畫面並正在等待登入。有沒有一種方法可以讓我以程式設計方式登入?如果沒有,我可以以某種方式運行 GUI 程序,例如smplayerroot 用戶儘管顯示登入畫面? (到目前為止,情況還不是這樣。)

(我不希望將計算機暫停到簡單的睡眠狀態,從而永遠不會註銷,因為我不想在我暫停/睡眠我的計算機時提前知道我最後一次這樣做需要明確的是,我不想在所有情況下自動登錄,只有當計算機為此目的被喚醒時。

我現在是 LTS 16。

答案1

您可以使用xdotool登錄,但需要注意以下幾點:

  1. 為了為 xdotool 選擇登入畫面的窗口,您需要將變數設定為XAUTHORITY.Xauthority您的使用者相對應的檔案(通常為 )/home/myuser/.XauthorityDISPLAY
  2. xdotool以要登入的使用者身分執行。 (你的腳本將以 root 身分執行。實際上,在某些情況下它會以你的登入使用者身分執行,例如導致 sleep by /lib/systemd/systemd-sleep suspend,但在一般情況下,即systemctl suspend,它將以 root 身分執行。)
  3. 若要使其僅在鬧鐘導致喚醒時觸發,請使用 APIlinux/rtc.h將電腦的當前時間 ( RTC_RD_TIME) 與鬧鐘時間 ( RTC_ALM_READ) ON進行比較/dev/rtc0。如果您的腳本運行時它們靠近在一起systemd/system-sleep,那麼您可能會猜測這是警報觸發的喚醒。

範例程式碼:

#!/bin/sh
# /lib/systemd/system-sleep/myscript
# PW64 is a variable holding a base64-encoded password

if [ post = $1 ] && [ suspend = $2 ] && [ $(whoami) = root ]; then
  if get_alm_time 10; then # this is an external program you should write to compare RTC_RD_TIME TO RTC_ALM_TIME
    export XAUTHORITY=/home/mysuer/.Xauthority
    export DISPLAY=:0
    su -c "xdotool type $(printf $PW64 | base64 -d)" myuser &&\
    su -c 'xdotool key Return' myuser &&\
    su -c 'bash my-other-script.sh' myuser
  fi
fi

相關內容