gliderlabs/sshを利用してSSHをプラガブルに操作する

今日帰る前に tsurubee3 と、SSHのコネクションアレコレできたら楽しそうじゃんみたいな話をしていて、gliderlabs/sshを利用したら割とシュッとできたので紹介します。

gliderlabs/sshはSSHの認証や各ステップをミドルウェアパターンで拡張できるSSHサーバのライブラリです。今回は、このライブラリを利用して、SSHのパスワード認証をコンテキストに保持して使いまわしたり、PTYの入力を標準出力にパイプする実装を書いてみました。

動作としてはこんな感じ。

サーバ側

% make server
==> Installing Dependencies
go get -u github.com/golang/dep/...
dep ensure
go run main.go

クライアント側

% ssh localhost -p2222
yamashitakazuhiko@localhost's password:

パスワードは testにしておるので、入力した段階で、contextに保存され、サーバ側で下記のように表示されます。

user password: test

あとは、クライアント側でタイプした内容が次々と標準出力に出る感じです。

user password: testpyama saikou

改行してないからあれな感じになっちゃいましたね・・・。

Golang、標準ライブラリやそれを利用したミドルウェア実装が豊富で、アイディアさえれば何でも出来ちゃう状況にあるので、こういうおもしろハックを突き詰めていくと事業を差別化する技術シュッと作れそうで便利な世の中になったなぁと思いました。

ただこの実装だとSCPがカバーできてないのと、SCPのGolang実装あまりなさそうだから、RFP読むなり、sshd読むなりして実装すると楽しそう。