醒来后以编程方式登录

醒来后以编程方式登录

我的情况是,我希望rtcwake -m no在我睡觉时唤醒我的电脑,并使用systemd/systemd-suspend脚本触发smplayer以通过播客队列唤醒我。

我的问题是smplayer无法在唤醒时运行,因为 Ubuntu 会加载登录屏幕并等待登录。有没有办法通过编程登录?如果没有,我能否以某种方式运行 GUI 程序,例如smplayer以 root 用户身份运行尽管登录屏幕是否显示?(目前为止,还没有这样运行。)

(我不希望将计算机挂起到简单的睡眠状态,从而永远不注销,因为我不想在挂起/睡眠计算机时提前知道我是在一天中的最后一次这样做。要明确的是,我不想在所有情况下都自动登录,只在为此目的唤醒计算机时才自动登录。)

我在使用 LTS 16。

答案1

您可以使用xdotool登录,但请注意以下几点:

  1. 为了为 xdotool 选择登录屏幕的窗口,您需要将变量设置XAUTHORITY.Xauthority与您的用户相对应的文件(通常是)/home/myuser/.Xauthority。还要设置DISPLAY变量。请参阅下面的代码示例。
  2. 以要登录的用户身份运行xdotool。(您的脚本将以 root 身份运行。实际上,在某些情况下,它会以您登录的用户身份运行,例如通过 导致睡眠/lib/systemd/systemd-sleep suspend,但在一般情况下,即systemctl suspend,它将以 root 身份运行。)
  3. 要使此功能仅在闹钟是唤醒原因时触发,请使用 APIlinux/rtc.h将机器的当前时间 ( RTC_RD_TIME) 与闹钟时间 ( RTC_ALM_READ)进行比较/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

相关内容