GoTTY - Share your terminal as a web application
https://github.com/yudai/gotty
Qiita でも既にいくつか紹介されていますが、
個人的に使用した感じをメモ代わりに残してみます。
ちなみに、同じ名前で別のツール(こちらの方が名前的にそのままで Go による Terminal アプリ)もあるので、ご注意を。
さて、このツール、コマンドラインの入出力を WebSocket を使ってブラウザ上の入出力にマッピングして、簡単にサーバー上の端末画面をブラウザに表示してくれちゃいます。
インストール
は簡単で、Go 製のワンバイナリになっているので、GitHub の Release ページから
https://github.com/yudai/gotty/releases/download/v0.0.12/gotty_linux_amd64.tar.gz
をダウンロードして解凍後、然るべき場所にコピーすればすぐに使えます。
$ wget -qO- https://github.com/yudai/gotty/releases/download/v0.0.12/gotty_linux_amd64.tar.gz | sudo tar zx -C /usr/local/bin/
$ gotty -v
gotty version 0.0.12
使い方
一番シンプルなのが、
$ gotty bash
2016/02/16 04:48:46 Server is starting with command: bash
2016/02/16 04:48:46 URL: http://127.0.0.1:8080/
2016/02/16 04:48:46 URL: http://[::1]:8080/
2016/02/16 04:48:46 URL: http://192.168.64.2:8080/
2016/02/16 04:48:46 URL: http://[fe80::3070:cbff:fe56:cf32]:8080/
2016/02/16 04:48:46 URL: http://172.17.0.1:8080/
で、ブラウザから上記アドレスにアクセスすると、bash のコマンドプロンプトが表示されます。
でも、デフォルトのモードでは入力を受け付けてくれません。
一度 gotty
を終了させましょう。Ctrl+C
を二回で終了出来ます。
入力も可能にするには、
$ gotty -w bash
2016/02/16 04:58:37 Permitting clients to write input to the PTY.
2016/02/16 04:58:37 Server is starting with command: bash
2016/02/16 04:58:37 URL: http://127.0.0.1:8080/
2016/02/16 04:58:37 URL: http://[::1]:8080/
2016/02/16 04:58:37 URL: http://192.168.64.2:8080/
2016/02/16 04:58:37 URL: http://[fe80::3070:cbff:fe56:cf32]:8080/
2016/02/16 04:58:37 URL: http://172.17.0.1:8080/
で、これでブラウザがターミナルソフトに変身します。
これで直接 SSH が通らないような場所からでもブラウザで簡単にアクセスすることが出来てしまいます。なんか、いろいろ使えそうな気がして来ました。
もちろんこれでは、セキュリティ的にまずいので、Basic認証をかけたり、ランダムなURLを発行したり、TLS を設定するオプションもそろっています。
Docker のお供に
本家の GitHub の README でも紹介されていますが、
$ gotty -w docker run -it --rm busybox
で、busybox のコンテナのシェルにブラウザからアクセス出来るようになります。
いろいろネットワーク的に面倒なことを考えずにどんなコンテナにもアクセス出来ます。
こりゃ便利!
でも、実際にお試しした方はお気づきかも知れませんが、GoTTY は通常の Web サーバーと同様にブラウザからアクセスした時に gotty
のコマンドラインで指定したプログラムを起動してコネクションを確立するため、ブラウザの画面を閉じたりリロードする度に、新規にプログラムが起動されるので、コンテナ(ブラウザ画面、セッション)はその場限りの環境ということになります。
これはこれで、コンテナとしては問題ないし、セキュリティ的にもありがたいのですが、
コンテナの Docker イメージの開発やデバッグ、共同作業するとなるとちょっと不便です。
そういうことをこれでやるか?って話もありますが。。。
そこで、ちょっと考えてみました。
$ docker run -d --name busybox busybox nc -p 8080 -l -l -e echo hello world!
0d634dce2946062533b4fe0915302274f82727d99ae5038f02ed98ee76a04d69
$ gotty -w docker exec -it busybox sh
ちょっと強引ですが、コンテナをデーモンモードで起動させておいてから、docker exec
でアクセスするというもの。これなら、docker exec
を複数回起動しても同一のコンテナのコンテキストにアクセスできるので、いつどこからアクセスしても前回の作業は残ったまま続けられます。
生の busybox だとあまり恩恵はありませんが、アプリケーション・コンテナだったら便利かも。
という訳で
いろいろ工夫するとアイデア次第で活躍しそうな気がします。
ファイアーウォール越しのプレゼンでのデモとか。
くれぐれも
公開範囲とかコンテナのオプションとか、セキュリティには十分注意してください。
それではまた。