起床後にプログラムでログインする

起床後にプログラムでログインする

rtcwake -m no私のシナリオは、寝ている間にコンピューターを起動し、systemd/systemd-suspendスクリプトを使用してsmplayerポッドキャストのキューで私を起こすようにトリガーすることです。

問題は、smplayerUbuntu がログイン画面をロードしてログインを待っているため、起動時に実行できないことです。プログラムでログインする方法はありますか? そうでない場合、smplayerルートユーザーなどの GUI プログラムを何らかの方法で実行できますか?その間ログイン画面が表示されますか? (今のところ、そのようには機能していません。)

(コンピューターを単純にスリープ状態にしてログアウトしないようにすることは望んでいません。なぜなら、コンピューターをサスペンド/スリープ状態にするときに、それがその日の最後の時間であることを事前に知っておく必要がないようにしたいからです。明確に言うと、すべての場合に自動的にログインするのではなく、この目的でコンピューターが起動されたときのみログインしたいのです。)

私はLTS 16を使用しています。

答え1

ログインに使用できますxdotoolが、いくつか注意すべき点があります。

  1. xdotool にログイン画面のウィンドウが選択されるようにするには、変数をユーザーに対応するファイル (通常は )XAUTHORITYに設定する必要があります。また、変数も設定します。以下のコード サンプルを参照してください。.Xauthority/home/myuser/.XauthorityDISPLAY
  2. xdotoolログインするユーザーとして実行します。(スクリプトは root として実行されます。実際には、 によってスリープ状態になるなど、いくつかの状況ではログインしたユーザーとして実行されます/lib/systemd/systemd-sleep suspendが、通常の状況、つまり ではsystemctl suspend、スクリプトは root として実行されます。)
  3. アラームがウェイクアップの原因である場合にのみこれを実行させるには、linux/rtc.hAPI を使用してマシンの現在の時刻 ( 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

関連情報