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 ファイルに追記しています
スクリプトは実際に実行させたいものを作成すればよい
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秒のタイムラグが発生しますが、実際的に問題はないでしょう。
「ショートカットでシェルスクリプトを実行できる」ことが重要ですから。
0 件のコメント:
コメントを投稿