Faça login programaticamente depois de acordar

Faça login programaticamente depois de acordar

Meu cenário é que desejo usar rtcwake -m nopara acordar meu computador enquanto estou dormindo e usar systemd/systemd-suspendscripts para acionar smplayerpara me acordar com uma fila de podcasts.

Minha dificuldade é que smplayernão consigo rodar ao acordar porque o Ubuntu carrega a tela de login e está aguardando um login. Existe uma maneira de fazer login programaticamente? Caso contrário, posso de alguma forma executar um programa GUI, como smplayerusuário rootenquantoa tela de login é exibida? (Até agora, não está funcionando dessa maneira.)

(Não desejo suspender o computador para uma simples suspensão, nunca efetuando logout, porque não quero saber com antecedência quando suspender/colocar meu computador em suspensão, que estou fazendo isso pela última vez de o dia. Para ser claro, não quero fazer login automaticamente em todos os casos, apenas quando o computador for ativado para esse fim.)

Estou no LTS 16.

Responder1

Você pode usar xdotoolpara fazer login, mas há algumas coisas a serem lembradas:

  1. Para que a janela da tela de login seja selecionada para xdotool, você precisa definir a XAUTHORITYvariável para o .Xauthorityarquivo que corresponde ao seu usuário (geralmente /home/myuser/.Xauthority. Defina também a DISPLAYvariável. Veja o exemplo de código abaixo.
  2. Execute xdotoolcomo o usuário que fará o login. (Seu script será executado como root. Na verdade, ele será executado como seu usuário logado em algumas circunstâncias, como causar sleep by /lib/systemd/systemd-sleep suspend, mas em circunstâncias normais, ou seja systemctl suspend, será executado como root.)
  3. Para fazer isso disparar apenas quando o seu alarme for a causa do seu despertar, use a linux/rtc.hAPI para comparar a hora atual da máquina ( RTC_RD_TIME) com a hora do alarme ( RTC_ALM_READ) ON /dev/rtc0. Se eles estiverem próximos quando o script for systemd/system-sleepexecutado, você pode supor que se trata de uma ativação acionada por alarme.

Código de amostra:

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

informação relacionada