btoメモ

なんか適当に書く

AJAX SSH作ってみた

AjaxSSHクライアントを作ってみた。

ajaxssh

デモページ

IE では動きません。firefox での動作を確認してます。

IE で動かないのは

xmlhttprequest.readystate == 3

で途中まで届いているデータを取ることができないから。

もしうまい方法知っている方がいれば、是非教えてください。

AjaxSSHクライアントを作る問題点は、

Ajax(というよりHTTP)がstatelessだということです。

ssh はコネクションを切らずに状態が遷移しますから、

データを POST するたびに毎回サーバ側で ssh を exec するような実装では

ちゃんとした ssh クライアントとして動作しないわけです。

(cd とかしても次にコマンドを送信するときはカレントディレクトリが元の位置に戻る)

そこでサーバ側でデーモンを動かして、デーモン経由で ssh と通信するようにしました。

これなら ssh を終了することなくデーモン経由でコマンドを送信することができます。

具体的な通信経路は次のようになります。

ブラウザ

↑↓ xmlhttprequest

ssh.php

↑↓ named pipe

ssh-wrapper(daemon)

↑↓ pseudo terminal

ssh

ブラウザは xmlhttprequestssh.php と通信します。

コマンドを実行するたびに ssh.php にデータを POST して

結果を受け取ります。

ssh.php は一番最初は ssh-wrapper を起動します。

ssh.php は名前つきパイプ経由で ssh-wrapper と通信します。

ssh-wrapper はデーモンプログラムで実行するとバックグランドに移行します。

擬似端末を作成し ssh を起動します。ssh とはこの擬似端末経由で通信します。

最初双方向パイプで ssh と通信しようと思ったのだけど、

ssh が制御端末にデータを出力する部分があるので擬似端末経由にしました。

名前つきパイプを作成し、ssh.php とはこの名前つきパイプ経由でデータ通信します。

ソースコードを一応置いておきました。

分かる人だけ自分の環境に入れてみてください。

追記:

パスワードの入力でさえも画面に表示されてしまうという恐ろしい仕様w

だったのですが、修正してパスワード入力の場合は画面に表示されないようにしました。