dT*blog

design and programming

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

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だとこういうことも簡単にできるんだなーということで、ひとり満足。もはや独自プロトコルの対応以外では、自分でソケット操作とか面倒でしてられないもん。

お疲れさまでした。

Posted by dT by 20:54

トラックバック

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

コメント




保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30