expect_expectl関数 - PHPから対話型シェルに応答する
expect_expectl関数についてはこちら。
PHP: expect_expectl - Manual
キー入力が必要なプログラムやシェルに応答するためのPHPスクリプトを作る場合に使用します。
PHPのsystem関数では、このキー入力に応答できないためです。
サンプル
この例は上記マニュアルにもある、SCPを使ったファイルコピーの例。
<?php ini_set("expect.timeout", 30); $stream = fopen("expect://scp -r -P 7022 /tmp/srcdir user1@server1:/tmp", "r"); $cases = array ( array (0 => "password:", 1 => PASSWORD), array (0 => "(yes/no)?", 1 => YESNO) ); while (true) { switch (expect_expectl($stream, $cases)) { case PASSWORD: fwrite($stream, "user1pwd\n"); break; case YESNO: fwrite($stream, "yes\n"); break; case EXP_TIMEOUT: case EXP_EOF: break 2; default: die("scp error!\n"); } } fclose ($stream); ?>
expect_expectl関数を動かすまで
さて、このexpect_expectl関数、動かすまでに結構苦労しました。
PHP Fatal error: Call to undefined function expect_expectl() in /home/scp.php on line 11
と、関数が見つからないエラーが発生します。
この PECL 拡張モジュールは PHP にバンドルされていません。 この PECL 拡張モジュールをインストールする方法は、マニュアルの PECL 拡張モジュールのインストール という章にあります。新規リリース・ダウンロード・ソースファイル・管理者情報・CHANGELOG といった関連する情報については、次の場所にあります。 http://pecl.php.net/package/expect.
Willkommen auf PHPWelt.net NEU! kostenloser Counter ohne Anmeldung und Werbung Sie möchten großen Aufwand wissen wieviele Besucher ihre Website täglich verzeichnet ?! benötige...
というわけで、PECL拡張モジュールとしてのコンパイル&インストールが必要になります。
ライブラリ依存があるので、かなり大変でした。
参考になったのはズバリこのサイト。
http://longinus.org/?p=1765
tcl のインストール
# cd /usr/local/src
# wget http://jaist.dl.sourceforge.net/sourceforge/tcl/tcl8.4.6-src.tar.gz
# tar -zxvf tcl8.4.6-src.tar.gz# cd tcl8.4.6/unix
# ./configure --prefix=/usr
# make
# make install
libexpect のインストールと有効化
# cd /usr/local/src
# wget http://expect.nist.gov/src/expect-5.43.0.tar.gz
# tar -zxvf expect-5.43.0.tar.gz
# cd expect-5.43
# ./configure --with-tclinclude=../tcl8.4.6/generic --enable-shared
# make
# make install
# cd /usr/local/lib
# ln -s libexpect5.43.so libexpect.so
# /sbin/ldconfig
php-devel のインストール
私が使っているのはMiracle Linuxです。
MIRACLE LINUX V4.0 Asianux Inside
- 出版社/メーカー: ミラクル・リナックス
- 発売日: 2007/03/01
- メディア: CD-ROM
- この商品を含むブログ (1件) を見る
#rpm -Uvh php-5.0.5-8.18AX.i386.rpm php-devel-5.0.5-8.18AX.i386.rpm php-pear-5.0.5-8.18AX.i386.rpm
これで phpize コマンドが使えるようになります。
expect拡張モジュールのインストール
# cd /usr/local/src
# wget http://pecl.php.net/get/expect-0.2.4.tgz
# tar -zxvf expect-0.2.4.tgz
# cd expect-0.2.4
# phpize
# ./configure
# make
# cp -p modules/expect.so /usr/lib/php/modules/.
/etc/php.ini のextensionパラメータを編集
extension=expect.so
これでやっとこさ使えるようになります。