ターミナル操作をブラウザに表示したり、 逆にブラウザからターミナル操作を行う事を可能にする GoTTY というアプリケーションがなかなか面白いです。
gotty
GoTTYはGoで作られたアプリケーションで、 コマンドライン操作をブラウザに表示したり、 ブラウザ自体をターミナル化してコンピューターを操作を可能にする事が出来ます。
GoTTYサーバーを立ち上げてブラウザからアクセスする形なので、 ネットワークさえ通っていれば他の端末のターミナルを見たり、 逆に他の端末をブラウザから操作することも可能になります。
インストールはMacのHomebrewで
$ brew install yudai/gotty/gotty
とするかgo get
で
$ go get github.com/yudai/gotty
使い方としてはgotty
コマンドに表示させたいコマンドを引数として与えてあげればOK。
$ gotty top
とするとtop
コマンドが走るGoTTYサーバーが立ち上がるので、
ブラウザから
http://127.0.0.1:8080/
(デフォルトではポートは8080に設定されてるのでローカルホストの8080にアクセス)
に接続すればtop
コマンドの表示を見ることが出来ます。
この状態だとブラウザの方からは操作できない状態ですが、
-w
を与えるとブラウザからも操作できる様になります。
普通のターミナル操作をさせたいのであればbash
やzsh
を与えてあげて
$ gotty -w bash
とすると、ブラウザ内で普通のターミナルが立ち上がる様な状態になり、 そこから実際に操作することが出来ます。
このコマンドを起動させておけば、IPアドレスが分かる端末であれば どこからでもブラウザ一つでターミナル操作が出来るようになる、というかなり強力なものです。
ので、これを安易に行うとIPアドレスを知られてる人に 直接コマンド操作される様な状態になってしまって 結構危険なのでちょっと気をつけないといけません。
ポート管理をしたり色々プロテクトすべき所もありますが、
GoTTYの中でも-c <user>:<password>
としてパスワードをかけたり、
また-r
を与えるとURLにランダムな文字列を加えたりすること(http://127.0.0.1:8080/fu2quvbl
みたいな感じ)も出来ます。
また、SSL/TLSを使った認証を使うことも出来ます。
さらに面白い使い方としては、 実際に作業している所を皆に見せる様なことも出来ます。
普通にGoTTYを立ち上げるとブラウザで開くたびに そのコマンドを新たに実行するサブプロセスが起動してしまうので 同じ画面を見ることは出来ません。
そこでGoTTYのREADMEではtmuxを使う方法が書かれています。
そこにはtop
コマンドを表示することが書かれてますが、
普通に操作を見せたいのであれば、まず、
$ tmux new -A -s gotty
としてgotty
という普通にシェルを立ち上げる新しいtmuxのセッションを作ります。
(この時にgotty
というセッションが既に存在すればそれをアタッチ。)
次に、他のターミナルで
$ gotty tmux new -A -s gotty
としてgotty
セッションをアタッチするコマンドを行う
GoTTYサーバーを立ち上げてあげれば
ブラウザから開くと最初の端末で行われている作業を見ることが出来ます。
-w
を与えなければ見ることだけが出来る状態です。
この場合は先にブラウザで開いてしまった後に
$ tmux new -A -s gotty
を行って操作を開始しても問題ありません。
同様の事をGNU screenで行おうとすると、 まず、
$ screen -S gotty
としてgotty
という名のセッションを作って
$ gotty screen -x gotty >& /dev/null
でブラウザからアタッチ、と言う感じですが、 この場合は最初の端末で先にセッションを作っておかないと ブラウザからは見れません 1。
ちょっとややこしいのでこの場合はtmuxを使ったほうが便利です。
他のもの
他にも IonicaBizau/web-term と言ったJavaScript製のものもありました。 こちらも同じような動作をしますが、 上に書いたtmuxを使った画面シェアの仕方、みたいな方法は上手く行きませんでした。 (実行コマンドに引数を与えることが無理っぽい?)
またGoTTYも元々 krishnasrinivas/wetty というJavaScript製の物を参考にして作っているとのことです。
まとめ
ということでGoTTYというアプリケーションをちょっと使ってみましたが ブラウザからのターミナル操作もかなり快適に普通に使えて驚きました。
セキュリティーの問題さえきちんと気をつけられれば どこからでもブラウザだけでターミナル操作出来る環境を作れるのは結構すごいです。
現実的には作業する時に手元にターミナル環境が無いことはまず無いので セキュリティーを頑張ってまでターミナルサーバーとして使うか、と言うと あまり無いかもしれませんが。
一方でブラウザを通じて作業を表示する方法は色々な場面で使えそうです。 同じサーバーに入って作業できるのであれば tmuxやscreenのみを使ってターミナル同士で見せ合うことも出来ますが、 この方法であれば、操作する人のIPアドレスさえ分かれば (同一LAN内とかならローカルアドレスでもOK) 自分の端末のブラウザから見ることが出来るので 非常に簡単に出来ます。
後は昨日紹介したターミナル上でのリッチモニターなんかも この方法を使えばそのままブラウザを通じて外から見ることも出来ます。
まあ、その場合は普通にHTMLとかで表示するの作れば良いじゃん、と言う所もありますが。。。
-
screenの場合は
-x
はアタッチされた状態のものしか取れません。逆に
-r
はデタッチされたものしか取れません。-R
というオプションもありますが、これは デタッチなものがあればそれを取りますが、 該当の名前のセッションが無いか、すでにアタッチされたものしか無ければ 新しいセッションを作ります。screenの場合にはセッション名は正確には
PID
.Name
の様な形になり、-S
で指定するのはName
の部分だけなので-R
で既にアタッチされた同じName
の物がある場合は 新たなプロセスで別のPID
でのセッションを作ることになります。