Web Artisan Blog - ウェブ アルチザン ブログ

PHP:Secure Shell2 関数を試してみる

PHP (55 items)

2006年07月20日

PHPでも大概の事はできると思ってますが、リモートマシンに接続してシェル実行とかできんのかな?と思ってたらできるんですねー。

>CXLVIII. Secure Shell2 関数

インストールですが、相変わらずPHPのドキュメントはしっかりしているので、上記リンク内に全て書いてあります。

libssh2は、libssh2より、最新バージョン”libssh2-0.14”をダウンロード。解凍して、コマンドを打つ。
 ./configure && make all install


PECL/ssh2は、PEARコマンドを使用せず、PECLより、最新バージョン”ssh2-0.10.tgz ”をダウンロード。解凍して、コマンドを打つ。
phpize && ./configure --with-ssh2 && make


PECL/ssh2インストール後、ssh2-0.10/modules配下のssh2.soファイルを、php.iniのextension_dirに指定しているディレクトリにコピー。
(この時、紛らわしいlibssh2.soファイルをコピーしたりして、実は苦戦。。ドキュメントには素直に従うべし。)

apache再起動後、phpinfoにssh2の項目が設定されているのを確認し、設定完了。

ssh2
libssh2 version 0.14
banner SSH-2.0-libssh2_0.14
remote forwarding enabled
hostbased auth enabled
polling support enabled
publickey subsystem enabled


で、実際のシェル実行のロジックですが、まずssh2_connectでリモートマシンに接続し、ssh2_auth_passwordでパスワード認証を行って、、と何となくドキュメント見てればわかります。
但し、ドキュメントにも書き込みがありますが、肝心のコマンド実行はssh2_execを使用するのではなく、ssh2_shellを使用するのがいいようです。
要は、ssh2_shellでシェル要求を行い、コマンドはfwriteで発行。更にこの後、sleepで発行したコマンドの処理時間を考慮して待機させる事も重要です。これが無いと、コマンドが強制終了させられる形になるようです。コマンドの内容はfgetsで確認できます。
コマンドが複数に渡る場合は、fwrite→sleep→fgetsと繰り返し、最後にfcloseで終了します。


if (!($resource=@ssh2_connect("192.168.0.1"))) {
echo "[FAILED]";
exit(1);
}

if (!@ssh2_auth_password($resource,"root","your_password")) {
echo "[FAILED]";
exit(1);
}

if (!($stdio = @ssh2_shell($resource,"xterm"))) {
echo "[FAILED]";
exit(1);
}

$command = "/bin/ls /tmp\n";
fwrite($stdio,$command);
sleep(1);
while($line = fgets($stdio)) {
flush();
echo $line."\n";
}

$command = "/bin/ls /usr\n";
fwrite($stdio,$command);
sleep(1);
while($line = fgets($stdio)) {
flush();
echo $line."\n";
}






fclose($stdio);


PHPで立派なシェルを作成することも可能ですね。。

前の記事 次の記事

Comments

コメントは、まだ書かれていません

Add Comments

Trackback

トラックバックはありません

Trackback URL

http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=589