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

すごいじゃん!これ。
ライセンスはGPL?
どうも。ありがとうございます。
そういえばライセンスとかまだ考えてなかった。
とりあえずGPLにしようかなぁ。。。
おもしろい。
> きよたさん
どうもありがとうございますー
すごいね。
今度はこれで未踏いっとこう!
ソースレクチャーしてよ。
まあ、未踏に出すほどのネタじゃないよ。
技術的にはたいしたことしてないからw
また今度飲みにでも行きますか
うわ!本当に作ってる!
第1回PHP勉強会でのりで言ってみただけなのにw
そして気がつくのおそっ
勉強になりました。
どうも~
第1回PHP勉強会で誰か言ってたんですか?
僕は参加してないのでよく知らないです。。。
すごいっす。
ところで、ソース展開できないんですけど・・・
tar: これは tar の書庫ではないようです
tar: 次のヘッダをスキップします
tar: アーカイブに廃れた base-64 ヘッダが含まれています
tar: Read 160 bytes from ajaxssh-0.0.1.tar.gz
tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました
報告ありがとうございます
apache の設定がミスってたみたいです
修正しました
展開できました。
ありがとうございます。
初心者的な質問などしたいのですが、ここのコメントでしてよろしいでしょうか?
はい、いいですよ
遠慮なく
hi,
can you translate this "about ajax ssh" site into english?
That would be nice. It looks like an interesting tool.
MfG Andi
Hi,
could you translate this page into english, please?
it looks like an interesting tool, but i can't read anythink.
Thanks in forward.
Andi
I'll give it a try.
Just a moment please.
おお、本当にmasatoさんでした!お世話になります。
最近は
http://oss.moongift.jp/intro/i-2917.html
なものまでありますので、負けずに何卒次の展開を!
どうも!!
気が向いたら次の展開考えてみますー