tTerm がブラウザーで使えるようになりました
これまで tTerm は Telegram の中にあり、チャットから直接サーバーにコマンドを送るものでした。今日、ブラウザーで動く本物のターミナル、tTerm Web を公開します。すべてのサーバーとコンピューターを 1 つのタブで扱え、コマンドはそれぞれ独立したブロックになり、デバイスに鍵を置く必要もありません。
ボットがあるのに、なぜブラウザーなのか
手元にスマートフォンしかないときは、ボットが便利です。サービスの再起動、ディスクの確認、インストーラーの質問への回答などです。ただ、腰を据えた作業には大きな画面が欲しくなります。タブを何枚も並べ、vim や htop を全画面で使い、昨日のコマンドを履歴からすぐに見つけたいものです。
そのために作ったのが tTerm Web です。ノートパソコン、タブレット、スマートフォンのどのブラウザーでも開け、作業に使うデバイスには何もインストールする必要がありません。
コマンドごとに独立したブロック
普通のターミナルでは、すべてが 1 本の流れにつながってしまい、どこで 1 つのコマンドが終わり、次のコマンドが始まったのかを目で探す必要があります。tTerm では、コマンドごとに独立したブロックになります。コマンド本体、出力、終了コード、時間、ディレクトリ、git のブランチがひとまとまりです。
ブロックは出力ごとコピーでき、折りたたんだり再実行したりもできます。コマンドの実行中は出力がリアルタイムで流れ、終了するとブロックは、選択やコピーのしやすいプレーンテキストに落ち着きます。
エディターのような入力行
画面の下には専用の入力行があります。Shift+Enter で改行でき、履歴にあるコマンドがグレーで候補表示され、Tab で補完できます。履歴は tTerm 側で保存しているので、どのデバイスでも同じ履歴を使えます。
入力行の上には、いまいる場所が表示されます:ディレクトリとブランチです。クリックして一覧から別のものを選ぶと、cd や git switch が通常のブロックとして実行されます。また、取り返しのつかない危険なコマンドの前には、tTerm がもう一度確認します。
vim、htop、sudo
全画面のプログラムはターミナル領域全体に開き、いつもどおりに動きます。sudo も同様です。ブロックが不要なら、クラシックモードもあります:見慣れた、ひと続きのターミナルです。
タブを閉じてもターミナルは閉じない
ターミナルはブラウザーではなく、tTerm のサーバー上で動いています。サーバーでのビルド中にノートパソコンを閉じても、ビルドは続き、出力も残ります。別のデバイスで tTerm を開けば、ターミナルはそのままそこにあります。
別々のプロジェクトのタブを並べて開け、各タブには P/web-01、A/api-prod のようにプロジェクトのコードが付きます。Cmd+K でコマンドパレットが開き、任意のターミナルへの移動、任意のマシンでの新しいターミナルの起動、アクションの実行ができます。
マシンの接続方法
Linux サーバーはコマンド 1 つで接続できます。マシンを追加するときに tTerm Web がそのコマンドを表示するので、サーバーで実行します:
$ curl -sSL https://connect.tterm.net/s/… | sudo sh
インストーラーはサーバーに tterm というユーザーを作成し、そのユーザーの authorized_keys に 1 行を追加し、/etc/sudoers.d 内の専用ファイルで sudo 権限を与えます。sshd_config には触れず、sshd の再起動もせず、ポートも開けません。数秒後には、サーバーが一覧に表示されます。
macOS や Linux のコンピューターは、小さなエージェントを介して接続します。エージェントはログイン中のユーザーの権限で動き、自分から tTerm のサーバーへ接続するので、受信ポートは不要で、コンピューターが NAT の内側にあっても構いません。エージェントはコマンド 1 つでアンインストールできます。
セキュリティ
tTerm はお使いのマシンに接続します。だからこそ、アクセス権を簡単に付与でき、同じくらい簡単に取り消せるように設計しました。
- お使いの鍵は不要。tTerm は接続のたびに、あなたの名前が入った新しい SSH 証明書に署名します。証明書はそのサーバー 1 台でしか使えず、2 分後には無効になります。
- 署名を分離。署名に使う鍵は、ネットワークにつながっていない別のプロセスにあります。メインのプログラムはこの鍵を読めず、署名を依頼できるだけです。署名はすべて記録されます。
- 第三者を介さない。tTerm のサーバーは EU にあります。ページもターミナルもそこへ直接つながり、Cloudflare は DNS を担当しているだけで、コマンドを目にすることはありません。
- 簡単に取り消せる。tTerm でサーバーを削除すると、tTerm は自身のアクセス権をそのサーバーから取り除きます。サーバーが応答しない場合は、サーバー上で同じことを行うためのコマンドを tTerm が表示します。インストーラーが設定したそれ以外のものを削除する方法は、スクリプトの冒頭に書かれています。
- オープンソース。tTerm Web とエージェントは、AGPL-3.0 ライセンスのオープンソースです。インストールスクリプトは短いので、実行前に一読する価値があります。
料金
tTerm Web がベータ版のあいだは、どなたでも無料です。
有料プランは今後導入する予定で、その際は十分前もってお知らせします。
ボットはどうなるのか
@tTermNetBot は今後も残り、引き続き使えます。手元にスマートフォンしかないときに、チャットから直接サーバーへコマンドを送れます。今のところ、ボットと Web アプリは別々に動いていて、マシンの一覧もそれぞれ別です。いずれ 1 つにまとめる予定です。
今後の予定
次に取り組む大きなテーマは、チームでの作業です。プロジェクト内の役割、コマンドの共有ログ、同僚のターミナルのライブ閲覧を予定しています。閲覧されている側には、誰が見ているかが常に表示されます。Windows のコンピューターにはまだ対応していませんが、いずれ対応する予定です。