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

MIRACLE LINUX V4.0 Asianux Inside

http://www.miraclelinux.com/products/linux/ml40/index.html

#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 コマンドが使えるようになります。

# which phpize
/usr/bin/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

これでやっとこさ使えるようになります。