z2term
0.9.1 GPL-3.0 Android 10+ 約 26 MB root 不要 テレメトリなし

root なしで Linux を動かし、シェルから Android を操作するターミナル

Alpine / Ubuntu / Arch / Kali を選んで動かせます。約 20 個の z2-* コマンドで 通知・クリップボード・センサー・ライトなど Android 側の機能をシェルから呼べて、z2-when に登録すれば 充電や時刻や Wi-Fi の変化でスクリプトが起動します。Linux のデスクトップと、 VNC / RDP で繋いだ他のマシンのデスクトップは、シェルと同じタブの列に開きます。

alpine — z2term z2root
~ $ apk add ripgrep (1/2) Installing pcre2 (10.43-r0) OK: 42 MiB in 61 packages ~ $ z2version z2term 0.9.1 (664) engine : z2root # 用意するのは APK 1 つだけです ~ $

APK 1 つ · PC 不要 · Google Play では配布していません

~ $ z2help

できること

以下はすべて APK 1 つに入っています。コンパニオンアプリやセットアップスクリプトは要りません。

01Linux ディストリビューション

APK を入れれば apk / apt / pacman が使えます。実行エンジン z2root は本アプリ用に書いた ptrace ベースのユーザー空間実装で、root もカーネルモジュールも 要りません。Alpine / Ubuntu / Arch / Kali を設定から選び、あとから変えられます。

02z2-* コマンド

Android 側を扱うコマンドが約 20 個あります。通知、トースト、クリップボード、センサー、ライト、音量、 Intent、アラーム、読み上げ、画面消灯の抑止、共有、そして自端末への無線 adb。 どれもふつうのコマンドなので、シェルから呼べるものなら何からでも使えます。

03通知で質問する

name=$(z2-ask "ブランチ名は?") と書くと、通知の返信欄に質問が出て、打ち込まれた答えが シェル変数に入ります。アプリを開かずに答えられて、答えないまま閉じれば非ゼロ終了になります。

04z2-when

充電、電池残量、時刻と cron、Wi-Fi、回線の切り替わり、端末の起動、他アプリからの共有、受信 SMS、 センサー、届いた通知、フォルダへのファイル追加。これらをきっかけにスクリプトを起動します。ルールは ~/.z2term/when/ のテキストで、アプリを閉じていても端末を再起動しても残ります。

05GUI タブ

Xvnc と openbox を、アプリ内蔵の RFB クライアントで表示します。音声と動画も通ります。 z2gui でデスクトップ、z2run <app> で GUI アプリ 1 本とそのタブが 開きます。

06VNC / RDP

同じビューアがリモートにも繋がります。RFB 3.3〜3.8、認証は None と VNC パスワード。RDP は NLA 認証、初回の証明書確認、マウスとキーボード、音、テキストのクリップボード共有まで扱います。 保存した宛先に [VNC] と [RDP] のボタンが付きます。

07ファイル転送

SSH / SFTP、FTP、WebDAV、SMB2/3 のクライアント。既定ではいずれも一時的な SSH ポート転送を通るので、 資格情報が平文で流れません。鍵は Android Keystore が保持する ed25519 で、-L / -R の転送はタブを閉じても走り続けます。

08常駐サーバー

起動コマンドを 設定 → 常駐サーバーに登録すると、アプリを開かなくても裏で動き続け、 端末の再起動後に復帰します。小さな Web サーバーや同期デーモンをスマホに置いておけます。

09タイルとウィジェット

マクロをクイック設定のタイル(12 枠)とホーム画面のウィジェットに割り当てられます。ステータスバーの アイコンは 24×24 のドット絵に差し替えられます。もう 1 つのウィジェットは ~ 配下の ファイルの末尾を出し続けます。

10USB 機器

z2-usb list で機器を確かめ、z2-usb allow で Android の許可を取ると、 libusb や /dev/bus/usb/… を使うプログラムが手を入れずにその機器を開けます。 要るのはデータの通る OTG アダプタかハブだけです。

11z2doctor

版数、エンジン、空き容量、必要な権限、検知と自動化の状態を 1 コマンドで出します。NG の 行には対処が付き、最後に Issue へ貼れる短い報告が出ます。

~ $ ls ~/.z2term/macros/

マクロ

マクロは ~/.z2term/macros/ に置いたシェルスクリプトです。覚える専用言語は ありません。z2-when に登録すれば、アプリを閉じたままそれが走ります。

macros — z2term タブで切替
~ $ z2-notify -h -c "$(git rev-parse --short HEAD)" "ビルド完了" "3分12秒" # バナーで出て、「コピー」ボタンが付く ~ $ name=$(z2-ask "ブランチ名は?") ~ $ echo "$name" feature/rdp-audio ~ $ z2-when charge:start run ~/.z2term/macros/backup.sh w1756890000123 ~ $

1 行で書けること

充電を挿したらバックアップz2-when charge:start run ~/.z2term/macros/backup.sh

寝ているあいだに終わります。アプリは開きません。

通知に来た認証コードを拾うz2-when notify:otp run ~/.z2term/macros/otp.sh

コードが抜き出され、クリップボードに入ります。

実行前に自分に確認させるz2-ask "本番に出す?"

スクリプトが通知シェードで待ちます。答えなければ止まります。

自宅の Wi-Fi のときだけ同期z2-when net:online if=ssid=Home cooldown=1h run ~/.z2term/macros/sync.sh

絞り込みの書き方はどのきっかけでも同じです。見送った回もログに残ります。

他アプリから受け取って処理z2-when share:ext=pdf run ~/.z2term/macros/pdf.sh

共有シートで Z2Term を選ぶと、スクリプトがその PDF を処理します。

毎日やることをタイルにz2-tile set 1 vpn.sh -l VPN

クイック設定からワンタップ。アプリは開きません。12 枠あります。

アイコンを自分で描くz2-icon set 1 ~/pixel/rocket.txt

ステータスバーのアイコンを 24×24 のドット絵に差し替えられます。

声で報告させるz2-say "ビルド終わった"

画面が消えていても、シェルスクリプトから読み上げます。

フォルダを見張るz2-when file:new=/sdcard/Download run ~/.z2term/macros/sort.sh

入ってきたファイルを、改名・変換・転送します。

ホーム画面から走らせるウィジェット → マクロを選ぶ

ワンタップで裏で実行。走っているものはもう一度タップで停止。

サーバーを立てっぱなしにz2-server start web

アプリを閉じても端末を再起動しても動き続ける Web サーバー。

アプリ自身のタブを操るz2-session attach 2

別のタブに文字を打ち込むマクロ。ターミナルそのものの自動化です。

~ $ z2run xterm

タブの中のデスクトップ

GUI タブは別のビューアアプリではありません。アプリの中の RFB クライアントなので、 Linux のデスクトップも、リモートのマシンも、シェルと同じタブの列に並びます。

localXvnc + openbox

z2gui でデスクトップが立ち上がり、z2run <app> は GUI アプリを起動して タブを開きます。音声と動画も通ります。

vncVNC サーバーに繋ぐ

RFB 3.3 – 3.8、認証は None と VNC パスワード。宛先を保存すると、その横に [VNC] ボタンが付きます。

rdpRDP で Windows に繋ぐ

NLA(ネットワークレベル認証)、初回の証明書確認、マウスとキーボード、音、テキストの クリップボード共有。保存した宛先に [RDP] ボタンが付きます。

ssh既定で SSH の中を通る

リモートデスクトップも FTP・SMB・WebDAV と同じく、既定では一時的な SSH ポート転送を通ります。 直結にもできますが、そのときは暗号化が無くなると警告してからになります。

~ $ z2-img screenshots/*.png

画面

実機で撮ったものです。

~ $ less HANDBOOK.md

仕様

ターミナル
VT100 / xterm、256 色と true color、テーマ 9 種、検索つきスクロールバック、UTF-8 と東アジア文字幅、 代替画面、OSC 4 / 7 / 8 / 10 / 11 / 12 / 52。
エンジン
z2root は本アプリのために書いた ptrace ベースのユーザー空間実装で、root もカーネル モジュールも要りません。root 化済みの端末では chroot も選べます。
タブ
CUI と GUI のタブをドラッグで並べ替えられます。裏のタブは、何か動いていれば小さな点、 見ていないあいだに終わっていれば ✓ が付きます。
SSH
クライアントと、既定で localhost だけに bind する内蔵 sshd。鍵はアプリ内で作る ed25519 で、秘密は Android Keystore が暗号化します。known_hosts の確認あり。ポート転送は タブを閉じても残ります。
言語
英語・日本語・簡体字・繁体字。アプリの画面だけでなく、z2-* のヘルプや使い方、 端末に出るメッセージまで切り替わります。
ロック
指紋・顔・画面ロック(PIN / パターン)で起動をふさぎ、離れているあいだは最近のアプリの サムネイルも隠します。セッションと常駐サーバーは走り続けるので、夜通しの処理は中断されません。 z2scan self は外部ツールなしでこの端末を点検します(結果は端末内に留まります)。
通信量の上限
端末全体のモバイル通信量がその期間で設定値に達すると、Z2Term 自身の通信を止めます。 Wi-Fi と自宅 LAN はそのままで、他のアプリには影響しません。
持ち出し
設定・接続先・スニペット・自動化ルール・マクロ・テーマ・タイル・アイコン・辞書・キーボードの 学習を 1 ファイルにまとめて別の端末へ移せます。定期実行もできます。SSH の秘密は既定で入れず、 入れるならパスフレーズが要り、そのときは中身ごと暗号化されます。
端末ログ
ツールバーの ⚪ を押すと、そのタブに出ているものが ~/z2term-log/ のテキストに書かれます。 もう一度押すと停止。既定では色と制御コードを落として素のテキストにします。
共有とスニペット
他アプリから共有されたテキストは入力行に挿入されるだけで、実行されません。スニペットは 棚に分けられるので、増えても使うものが沈みません。
ライセンス
GPL-3.0。テレメトリなし、アカウントなし、アプリ内課金なし。Google Play では配布していません。

~ $ ls -lh releases/latest/

入手する

APK は 1 つだけです。OS も外部の prebuilt も同梱していないので、初回起動で 設定 › Linux 環境からディストロを選びます。選んだものが公式 CDN から取得され、SHA-256 で 検証されます。取得は 1 回きりで、アプリを更新しても落とし直しません。

releases — github.com/orgsonai/z2term
~ $ ls -lh releases/latest/ -rw-r--r-- 1 you you 26M z2term-0.9.1.apk # 端末でタップ → 「提供元不明のアプリ」を許可 # 上書きインストールでデータは残ります

更新のしかた

アプリ内更新を確認

設定 → アプリ情報 → 更新を確認。ボタンを押したときだけ GitHub に問い合わせ、 新しい APK を落としてインストール画面まで進みます。最後のタップはご自身の操作です (どのアプリも自分を黙って入れ替えることはできません)。端末からは z2-update。

自動Obtainium

Obtainium に github.com/orgsonai/z2term を登録すると、新しいリリースが出たときにワンタップで 更新できます。ストアは要りません。

手動APK をタップ

Releases から新しいファイルを落としてタップするだけです。上書きインストールになり、 データはそのまま残ります。

0.9.x は安定版 1.0 の候補です。1.0 までは不具合の修正だけを出し、仕様と画面は 変えない予定です。