Termuxで家のPCの電源を一括で落とす

スマホから家のPCすべての電源を落とせるようにしたいと思い、色々調べた。最終的には、sshを使って各PCでshutdownコマンドを実行する方法に落ち着いた。

Termuxアプリのインストール

スマホからsshコマンドを実行するために、以下の記事を参考に作業しました。
https://qiita.com/Maki-HamarukiLab/items/05ccabba68703a7d7892

GitHubの公式情報によれば、Playストア版は実験ブランチらしいので、GitHubからリリース版(v0.118.1)をダウンロードしました。ちなみに、自分のスマホがARMv8だったのかも知らなかったので、そこから調べました。*1

Termuxの初期セットアップ

基本的に参照サイトのまま。

pkg update
pkg upgrade
termux-setup-storage
pkg install openssh
sshd
ip a

ただ、ip aを実行すると Cannot bind netlink socket: Permission denied と出たので、代わりに ifconfig を使いました。
その後、ユーザー名確認とパスワード設定をしました。

whoami
passwd

PCからTermuxにSSH接続

作業効率を上げるために、PCからTermuxにSSHで接続する。

ssh -p 8022 <ユーザー名>@<wlan0のアドレス>

これでPCからログインできるようになり、だいぶ作業が楽になります。Bluetoothキーボードがあるとさらに便利かも。

必要なツールもこのタイミングでインストールしました。

pkg install vim

公開鍵認証の設定

PC側ではすでに鍵を持っていたが、RSAが古かったのでこれを機に作り直した。

# PC側
ssh-keygen -t ed25519 # 必要なら鍵を生成
scp -P 8022 id_ed25519.pub <Termuxユーザー名>@<Termuxアドレス>:
# Termux側
mkdir ~/.ssh
cat ~/id_ed25519.pub >> ~/.ssh/authorized_keys

さらに、TermuxからPCへもログインできるように、逆方向の設定も行いました。

ショートカットからスクリプトを実行する設定

Termux:Widgetのインストール

ショートカットを作るために、GitHubからリリース版をインストールしました。
Termuxの~/.shortcuts/ディレクトリにスクリプトを配置します(なければ作成)。

mkdir -p ~/.shortcuts
cp your-script.sh ~/.shortcuts/
chmod +x ~/.shortcuts/your-script.sh
ホーム画面にウィジェットを追加

Androidのホーム画面にてウィジェットを追加する操作を行い、「Termux:Widget」を追加します。
「2x2」ではなく「1x1」の Termux shortcut を選ぶと、登録したスクリプトを個別にショートカットとして配置できます。
家のPCの電源を一括で落とす危険なスクリプトなので、Home画面の普段使わない面倒くさい場所にコッソリと置きました。

ショートカットをおいた場所
オリジナル画像リンク(139.86 KiB)

sshでシャットダウンを行うシェルスクリプト

最初はどのPCも同じ poweroff コマンドでいけると思ったのですが、結果的にPCごとに対応が必要でした。

#!/bin/bash

# XigmaNas
ssh user_name@address "poweroff" &
# Manjaro Linux
ssh -tt user_name@address "systemctl poweroff" &
# Windows
ssh user_name@address "shutdown /s /t 0" &

各OSごとの設定

XigmaNASの設定

特に何も考えずにsshdを起動したら、設定不足でうまく動きませんでした。Webインターフェースの「サービス→SSH」で「公開鍵認証を許可」にチェックを入れる必要がありました。

Manjaro Linuxの設定

苦戦して、色々と設定を触った結果、何が効いたのか分からない。最後に効果があったのは、 /etc/polkit-1/rules.d/50-nopasswd-poweroff.rules を追加して、wheelグループのユーザーがパスワード無しでsystemctl poweroffが実行できるようにした。

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.power-off" && subject.isInGroup("wheel")) {
        return polkit.Result.YES;
    }
});

Windowsの設定

sshdのインストール、sshdの立ち上げは省略。

鍵認証でログインできず苦戦しました。原因は、sshd_configの以下の設定で別のauthorized_keysを参照していたためでした。これをコメントアウトしたら解決しました。

Match Group administrators
       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

*1:スマホには全然興味がないです。