リモートサーバでコマンドを実行するSSH2関数

/ php

PECLのssh2モジュールを使うと、PHPでも簡単にリモートサーバを直接操作することができるっぽいので、セキュリティうんぬんはさておき、試してみた。

PHP: Secure Shell2 関数

まずは、libssh2 のインストール。

# wget http://nchc.dl.sourceforge.net/sourceforge/libssh2/libssh2-0.17.tar.gz
# tar xvfz libssh2-0.17
# cd libssh2-0.17
# ./configure --prefix=/usr/local/
# make all install

続いて、ssh2モジュールをソースから導入。

# wget http://pecl.php.net/get/ssh2-0.10.tgz
# tar xvfz ssh2-0.10
# cd ssh2-0.10
# /usr/local/bin/phpize
# ./configure --with-ssh2=/usr/local/lib
# make

ここで、ひたすらmakeに失敗して焦る。原因は、すでに入っていた古いlibssh2を参照していたため。--with-ssh2でパスを指定したら、うまくいきました。ほっ。

ソースディレクトリ配下のmodulesの下に、ssh2.soができるので、これをphp.iniのextension_dirで指定したディレクトリにコピー。続けて、php.iniでextensionに追加する。

php.ini

; Directory in which the loadable extensions (modules) reside.
extension_dir = "/usr/local/lib/php/extensions/"

extension=ssh2.so

ssh2.soをコピー。

# cp /usr/local/src/ssh2-0.10/modules/ssh2.so "/usr/local/lib/php/extensions/

ここまでできたら、apacheを再起動。うまくインストールできていれば、phpinfoでssh2の項目がでてくる。

簡単な使い方。

$con = @ssh2_connect("server_name", 22);
ssh2_auth_password($con, 'user', 'password');
$stream = ssh2_exec($con, "ls -al | wc -l");
stream_set_blocking($stream, true);
echo fread($stream, 4096);
fclose($stream);

結果。

12

ファイル削除など、出力のないコマンドの実行結果をとるなら、こんな感じかな?

$con = @ssh2_connect("server_name", 22);
ssh2_auth_password($con, 'user', 'password');
$stream = ssh2_exec($con, "rm -rf /tmp/hoge; echo $?");
stream_set_blocking($stream, true);
echo fread($stream, 4096);
fclose($stream);

結果。

0

まあ、実際に使うことは無さそうだけど、PHPだとこういうことも簡単にできるんだなーということで、ひとり満足。もはや独自プロトコルの対応以外では、自分でソケット操作とか面倒でしてられないもん。

お疲れさまでした。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/449