Программный вход после пробуждения

Программный вход после пробуждения

Мой сценарий заключается в том, что я хочу использовать 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. Чтобы это срабатывало только тогда, когда причиной вашего пробуждения является ваш будильник, используйте API linux/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

Связанный контент