Faça login programaticamente depois de acordar

1

Meu cenário é que desejo usar rtcwake -m no para ativar meu computador enquanto durmo e usar systemd/systemd-suspend scripts para acionar smplayer para me acordar com uma fila de podcasts.

A minha dificuldade é que smplayer não pode ser executado no wake up porque o Ubuntu carrega a tela de login e está aguardando um login. Existe uma maneira que eu possa entrar programaticamente? Se não, posso de alguma forma executar um programa GUI como smplayer como usuário root enquanto a tela de login é exibida? (Até agora, não está funcionando dessa maneira.)

(Eu não quero suspender o computador para um simples sono, assim nunca sair, porque eu não quero ter que saber de antemão quando eu suspendo / durmo meu computador que eu estou fazendo assim para o última hora do dia.Para ser claro, não quero fazer login automaticamente em todos os casos, apenas quando o computador for ativado para esse propósito.)

Eu estou no LTS 16.

    
por JellicleCat 09.09.2016 / 19:08

1 resposta

1

Você pode usar xdotool para 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 variável XAUTHORITY como o arquivo .Xauthority que corresponde ao seu usuário (geralmente /home/myuser/.Xauthority . Também defina a variável DISPLAY . amostra de código abaixo.
  2. Execute xdotool como o usuário que deve efetuar o login. (Seu script será executado como root. Na verdade, ele será executado como seu usuário logado em algumas circunstâncias, como, por exemplo, em /lib/systemd/systemd-sleep suspend , mas em circunstâncias normais, ou seja, systemctl suspend , ele será executado como root.)
  3. Para que isso seja acionado somente quando o alarme for a causa de sua ativação, use a linux/rtc.h API 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 um do outro quando o script em systemd/system-sleep for executado, você pode supor que se trata de um despertar acionado por alarme.

Exemplo de código:

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

if [ post =  ] && [ suspend =  ] && [ $(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
    
por JellicleCat 12.09.2016 / 17:27