Linux デスクトップ環境でサスペンドモードから安全にパスワード入力無しで復帰する方法

経緯

Linux がインストールされたノートPC をデブサミのような場所で会場移動する時、ノートPC を閉じると自動的に画面が消えてsuspend モードに入りそれをバッグに入れて会場を移動して、再度開くとsuspend が解除されて画面が映るものの、パスワードの入力が求められてしまう…その間わずか3 分程度なのに、これはちょっと煩わしかったりします。
そういったシチュエーションにおいて短時間のsuspend に関してはパスワードの入力無しでログインして復帰できる方法についてご紹介します。
挙動を確認したのはUbuntu 18.04, Arch Linux(KDE + sddm) です。

対処法

/lib/systemd/system-sleep/ 配下にスクリプトを置くと、suspend, hybernate 等を契機にスクリプトを実行させることができます。
また、そこに置かれたスクリプトはsuspend/hybernate 時にスクリプトが実行されると引数が渡される仕様になっているので、それを基準に動作を切り替えることができます。

例えば、suspend モードに入って、そのあとsuspend から復帰した時、suspend 時間が10 分以内であればパスワード入力無しで復帰できるようにするには以下のようにスクリプトを作成します。

/lib/systemd/system-sleep/unlock_suspend
#!/bin/bash

[ -f /opt/unlock_suspend/etc/unlock_suspend.conf ] && . /opt/unlock_suspend/etc/unlock_suspend.conf

# パスワード無しでunlock できるようにするsuspend 時間(秒単位)。これを超えてsuspend されていた場合は、復帰時にパスワードを入力しないとログインできない。
# また、/opt/unlock-suspend/etc/unlock-suspend.conf ファイルにSUSPEND_GRACE_TIME 変数の宣言がない場合も常にパスワードを求めるようにする
SUSPEND_GRACE_TIME=${SUSPEND_GRACE_TIME:-1}

file_time() {
    stat --format="%Y" "$1";
}

unlock_session() {
    sleep 1; loginctl unlock-sessions
}

# suspend の場合のみ動作するようにする。hibernate については特に何もしない
if [ "$2" != "suspend" ]; then  exit 0;  fi

# suspend に突入した時の時間を記録するため、ファイルをtouch する
if [ "$1" = "pre" ]; then  touch /tmp/last_suspend;  fi

# Resume
if [ "$1" = "post" ]; then
    touch /tmp/last_resume
    last_suspend=`file_time /tmp/last_suspend`
    last_resume=`file_time /tmp/last_resume`
    suspend_time=$[$last_resume - $last_suspend]

    if [ "$suspend_time" -le $SUSPEND_GRACE_TIME ]; then
        unlock_session
    fi
fi

上記スクリプトを作成したら、/opt/unlock_suspend/etc/unlock_suspend.conf ファイルに以下のように記述してください。

/opt/unlock_suspend/etc/unlock_suspend.conf
# パスワード無しで復帰可能なsuspend 時間(単位は秒)
# 本設定を定義しなかった場合は、suspend 復帰後、常にパスワード入力が求められる
SUSPEND_GRACE_TIME=600

テストするときは、ラップトップPC 等で実際に画面を閉じて、suspend モードになったのを確認後、開いてみてください。
すると画面を閉じて10 分以内であればパスワード入力無しでログイン復帰できますし、10 分以上経過している場合はパスワードを入力しないとログインできないという感じで安全性と利便性を両立したsuspend スケジュールを実現することができます。

常にパスワード入力無しでsuspend から復帰したい場合h

また、単にsuspend から復帰するときは常にパスワードの入力を省略したい場合は以下のようにスクリプトを作成すればOK です。
下記スクリプトはsuspend していた時間にかかわらず、復帰時にパスワードの入力を求められなくなります。

/lib/systemd/system-sleep/unlock_suspend
#!/bin/bash
[ "$1" = "post" ] && sleep 1 && loginctl unlock-sessions

参考

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.