ターミナルで動くプログラムをウェブアプリケーションとして共有するツール「GoTTY」を作った

デバッグセッションなどで「ターミナルの画面を共有したいけど、tmuxのセッション共有の設定をするのは面倒くさい」ということがよくあるのと、モニタリングツールなどをいじっていると「とりあえずはtopとtailの結果を大画面に表示しておければそれでいいんだ」のようなことがあるので、ターミナルの出力をそのままウェブで共有するツールを作った。

スクリーンショット
GoTTY - Share your terminal as a web application

インストールはGithubのReleasesページから直接バイナリをダウンロードしてくるか、go getもしくはHomebrewで行うことができる。

# go getの場合
$ go get github.com/yudai/gotty

# Homebrewの場合
$ brew tap yudai/gotty
$ brew install gotty

使い方は非常にシンプルで、共有したいコマンドの前にgottyを追加するだけで良い。

# topコマンドをウェブアプリケーションにする
$ gotty top

gottyコマンドを実行するとWebサーバがポート8080で起動するので、あとはブラウザでアクセスすれば実行されているコマンドが表示される。

デフォルトでは安全のためにクライアントからの操作は受け付けないようになっている。-wオプションをつけることでクライアントからの操作を受け付けるようにすることも可能だが、実行するコマンドによっては非常に危険な状態となるので注意が必要となる。

現在の実装では、クライアントがブラウザでアクセスするたびにgottyに与えられたコマンドが新しく起動するので、画面の共有に使いたい場合にはtmuxやGNU Screenなどと組み合わせて使う必要がある。例えば、tmuxの場合は次のようなコマンドでgottyを起動する。

$ gotty tmux new -A -s gotty top

画面の操作が必要な場合は、もう1枚のターミナルを開いてtmuxのセッションにアタッチすればよい。この場合、ブラウザ上のクライアントには操作を許さずに、ターミナルから直接tmuxに接続しているクライアントのみに操作を許すことができる。

$ tmux new -A -s gotty

将来的には簡単な画面共有機能をgottyにも実装するかもしれない。

クライアントごとに別のプロセスが起動することを利用して、Dockerと組み合せて遊ぶ事もできる。例えば以下の様なコマンドを実行すると、クライアントごとにDockerコンテナが立ち上がり、シェルで遊ぶことができる。

$ gotty -w docker run -it --rm busybox

GoTTY自体の実装は非常に単純で、PTYとブラウザをつなぐ単なるWebSocketサーバになっている。ブラウザ上で動作するターミナル部分はGoogleがChromeOS用に開発している「hterm」をそのまま流用しているので、GoTTY用に書いたコードはほとんど存在しない。htermの出来が非常に良いおかげで、大量のコードを書かずに欲しい機能を実装することができた。