【2025-02-01 追記・他の方法】
ショートカットのアクション「SSH経由でスクリプトを実行」を iPhone 内で実行するやり方で、記事末に記載
こちらの方が簡単にできて本命かも!!
iOS の iSH(Alpine Linux)でシェルスクリプトを自動実行させたい
この記事で、シェルスクリプトをショートカットを使って自動実行させる方法についての考え方を記載しました。
iSH は Android の Termux 相当のターミナルエミュレーターで、Alpine Linux ベースです。
パッケージを自由に追加できますのでいろいろなことが可能になります。
iPhone 向けのターミナルエミュレーターには a-Shell もありますが、こちらは機能が限定的なので、iSH の方が使い勝手が格段によい。
その iSH で作成したシェルスクリプトをショートカットで実行できると、ショートカットでできることの幅が拡がります。
本記事では具体的なやり方を事例を踏まえて記載します。
1.ショートカットのオートメーションの設定をします
ショートカットは、次の事例にします
・iPhone を電源に接続したとき
・アクションでクリップボードに「on」を設定
アクションはショートカットと iSH に共通に操作可能なものを使います
本事例ではクリップボードを使っていますが、特定ファイルの有無や、特定ファイルの内容
なども共通操作可能です
クリップボードの内容を、あとに記述の crontab に設定した iSH のシェルスクリプトで判定し「on」ならば目的のシェルスクリプトを実行させます
そこで「ショートカット」⇨「オートメーション」右上の + をタップして新しいオートメーションを開始します
「充電器」を選び「接続されている」をチェック、「すぐに実行」をチェックし右上の「次へ」をタップ
「新規の空のオートメーション」をタップ
「アクションを検索」欄に「テキスト」を入力し、現れた「テキスト」アクションをタップ
テキスト欄に「on」を入力します
続いて「アクションを検索」欄に「クリップ」と入力します
「クリップボードにコピー」アクションを選び、詳細の「有効期限」を「空白」設定します
つまり、クリップボードに「on」を設定するアクションです
同様に「充電器」が「接続解除されている」オートメーションを作成し、こちらの方は「テキスト」に「off」を入力します
「電源から接続解除」と「電源に接続」が追加設定したオートメーション |
ショートカット側の設定は以上で終わりです。
2.iSH アプリの設定を変更
「設定」⇨「アプリ」⇨「ほかのアプリからペースト」を「許可」に変更します
これは iSH がクリップボード参照時に「参照を許可するかどうか」の問い合わせをさせないための設定です
3.ファイルアプリでシェルスクリプトを作成
ファイルアプリを開き右下の「ブラウズ」をタップします
「場所」⇨「iSH」とし「/usr」をタップ
chk.sh という名前のシェルスクリプトを作成します
これは「判定要素(本事例ではクリップボードの「on」「off」)を確認」するシェルスクリプトで crontab から呼び出されます
次のような内容です
res=$(cat /dev/clipboard) #クリップボードの内容を得る
if [ $res = "on" ]; then #クリップボードの内容が "on" なら
sh /usr/swstat.sh # swstat.sh を実行
echo "off" > /dev/clipboard #クリップボードに "off" を設定
fi
クリップボードが「on」ならば目的のシェルスクリプト swstat.sh を実行し、クリップボードを「off」設定します
目的のシェルスクリプト swstat.sh を作成します
内容は次のようなスクリプトです
SwitchBot plus の状態を得て、結果を /usr 配下の stat というファイルに書き込むスクリプト事例ですが、かなりいろいろな処理を含んでいます
本事例は uuidgen / openssl / curl を追加パッケージとしてインストールし、トークン・Unix time・nonce を合成した認証情報を生成して base64 でエンコードして curl を叩いています
Unix time をミリ秒で得るため coreutils もインストールして date コマンドでミリ秒にしています
結果は stat というファイルに書き込みしています
また UTC 年月日時刻を JST 年月日時刻に変換して、stat ファイルに追記しています
このシェルスクリプト事例は SwithBot plus の状態を得ていますが、もちろん SwitchBot plug のオン・オフ制御も可能です。
なので、それを使って例えば 80% 充電したら SwitchBot plug をオフにする、といった自動化も可能になります。
スクリプトは実際に実行させたいものを作成すればよい
4.iSH での作業
iSH を起動します
crontab -e として編集開始し、次の設定をします
* * * * * for i in `seq 0 10 59`; do (sleep ${i}; sh /usr/chk.sh ) & done;
10秒ごとに chk.sh をバックグラウンドで起動する crontab です
iSH のプロンプトで次のコマンドを入力して2つのシェルに実行権を与え、crond で cron デーモンを起動します
また、iSH をバックグラウンドで動作させます
$ cd /usr # /usr にディレクトリを移動する
$ chmod 700 chk.sh swstat.sh # chk.sh と swstat.sh に実行権を与える
$ crond # cron デーモンを起動
$ cat /dev/location > /dev/null & # iSH バックグラウンド化のおまじない
5.オートメーションのアクションをテスト
/usr 配下の stat ファイルに swstat.sh 実行結果が書き込まれるかをアクションテストで確認する
ショートカットのアクションの右下にある ▶ をタップしてアクションをテストします
「電源に接続」のアクション内容 |
このアクションではクリップボードに「on」を書き込んでいます
「on」になると crontab で設定した chk.sh での判定が真になり、swstat.sh が実行されます
その結果 /usr 配下の stat ファイルには次のような内容が書き込まれます
実際に iPhone を電源に接続すると目的のシェルスクリプトが実行されます。
また電源から切断するとクリップボードにはショートカットによって「off」が設定されて chk.sh は何もしない判定になります。
以上が任意のシェルスクリプトをショートカットから実行させる具体事例です。
本事例では 10秒間隔で「判定要素を確認」なので、実際にシェルスクリプトが実行されるまでに最大 10秒のタイムラグが発生しますが、実際的に問題はないでしょう。
「ショートカットでシェルスクリプトを実行できる」ことが重要ですから。
【2025-02-01 追記・他の方法】
ショートカットのアクション「SSH経由でスクリプトを実行」を iPhone 内で実行するやり方
iSH で sshd を動作させ、ショートカットでこの sshd に ssh で接続してシェルやコマンド(群)を実行させるやり方です。
参考: https://github.com/januszoles/ish
このサイトの[📎SSH from the same device (not tested yet)]に「未テストだが同じデバイスから ssh する」とあり、下記の記述があります。
if you are trying to connect via ssh from the same device, make sure you set the port configuration of sshd to use a non standard one (greater than 1024, eg: 22000) . You can do this by editing /etc/ssh/sshd_config and set Port 22000 (Replace 22000 with any non-standard port). After this, you can ssh (from iSH itself) using ssh root@localhost -p 22000
このサイトに書かれているとおりに設定してみました。
iSH を開きます。
$ apk add openssh # openssh をインストール
$ passwd # 接続用パスワードの設定
[ファイル]⇨[etc ディレクトリ]⇨[ssh ディレクトリ]⇨[sshd_config を開く(エディターが開く)]
・13行目の「# Port 22000」のコメントを外す
・最終行の「PermitRootLogin yes」を確認「no」となっていた場合「yes」に変更
・保存して編集を終了
$ cat /dev/location > /dev/null & # iSH をバックグラウンド動作
$ /usr/sbin/sshd # sshd を起動(ssh サーバーとして起動)
ショートカットを開き、アクション「SSH経由でスクリプトを実行」を選択し、下図のように設定します。
スクリプト欄には実行させたいシェルスクリプトやコマンド(群)を記述し、ショートカット名を「シェル実行」とでもします。
ホストは iPhone 自身を示す localhost(127.0.0.1)を指定します。
ポートは 22000 を指定します。
ユーザは root を指定します。
認証は「パスワード」を選択し、その下のパスワード欄に passwd コマンドで設定したパスワードを設定します。
公開鍵認証方式にすることもできます。
その場合はパスワード設定(入力)は不要です。
右上の完了をタップして設定は終わりです。
本事例のシェルスクリプトは swstat.sh というシェルファイル名で内容は次図です。
ショートカットを開きます。
左上の「シェル実行」が作成したショートカットです。
これをタップすると ssh で iPhone 自身に接続して swstat.sh を実行します。
結果は stat というファイルに書き込まれます(下図)。