AJAX SSH作ってみた
IE では動きません。firefox での動作を確認してます。
IE で動かないのは
xmlhttprequest.readystate == 3
で途中まで届いているデータを取ることができないから。
もしうまい方法知っている方がいれば、是非教えてください。
Ajax(というよりHTTP)がstatelessだということです。
ssh はコネクションを切らずに状態が遷移しますから、
データを POST するたびに毎回サーバ側で ssh を exec するような実装では
ちゃんとした ssh クライアントとして動作しないわけです。
(cd とかしても次にコマンドを送信するときはカレントディレクトリが元の位置に戻る)
そこでサーバ側でデーモンを動かして、デーモン経由で ssh と通信するようにしました。
これなら ssh を終了することなくデーモン経由でコマンドを送信することができます。
具体的な通信経路は次のようになります。
ブラウザ
↑↓ named pipe
↑↓ pseudo terminal
ブラウザは xmlhttprequest で ssh.php と通信します。
コマンドを実行するたびに ssh.php にデータを POST して
結果を受け取ります。
ssh.php は一番最初は ssh-wrapper を起動します。
ssh.php は名前つきパイプ経由で ssh-wrapper と通信します。
ssh-wrapper はデーモンプログラムで実行するとバックグランドに移行します。
擬似端末を作成し ssh を起動します。ssh とはこの擬似端末経由で通信します。
最初双方向パイプで ssh と通信しようと思ったのだけど、
ssh が制御端末にデータを出力する部分があるので擬似端末経由にしました。
名前つきパイプを作成し、ssh.php とはこの名前つきパイプ経由でデータ通信します。
ソースコードを一応置いておきました。
分かる人だけ自分の環境に入れてみてください。
追記:
パスワードの入力でさえも画面に表示されてしまうという恐ろしい仕様w
だったのですが、修正してパスワード入力の場合は画面に表示されないようにしました。