Expect Functions
簡介
This extension allows to interact with processes through PTY. You may consider using the expect:// wrapper with the filesystem functions which provide a simpler and more intuitive interface.
需求
This module uses the functions of the » expect library. You need libexpect version >= 5.43.0.
安裝
本 » PECL 擴充功能未包含於 PHP 中。 安裝此 PECL 擴充功能的訊息可在手冊中標題為 PECL 擴充功能安裝的一章中找到。 更多訊息如新版本,下載,原始文件,維護者訊息以及更新日誌等可以在這裡找到: » https://pecl.php.net/package/expect.
在 PHP 4 中本 PECL 擴充功能的原始程式位於 PHP 原始程式中的 ext/ 目錄下或者在上面的 PECL 連結中。 In order to use these functions you must compile PHP with expect support by using the --with-expect[=DIR] configure option.
Windows users will enable php_expect.dll inside of php.ini in order to use these functions. 在 PHP 4 中本 DLL 位於 PHP Windows 執行套件中的 extensions/ 目錄下。 可以從 » PHP 下載頁面或者 » https://snaps.php.net/ 下載此 PECL 擴充功能的 DLL 文件。
執行時期設定
這些函式的行為受 php.ini 的影響。
In order to configure expect extension, there are configuration options in the configuration file php.ini.
名字 | 預設 | 可修改範圍 | Changelog |
---|---|---|---|
expect.timeout | "10" | PHP_INI_ALL | |
expect.loguser | "1" | PHP_INI_ALL | |
expect.logfile | "" | PHP_INI_ALL |
以下是設定選項的簡要解釋。
- expect.timeout integer
-
The timeout period for waiting for the data, when using the expect_expectl() function.
A value of "-1" disables a timeout from occurring.
Note: A value of "0" causes the expect_expectl() function to return immediately.
- expect.loguser boolean
-
Whether expect should send any output from the spawned process to stdout. Since interactive programs typically echo their input, this usually suffices to show both sides of the conversation.
- expect.logfile string
-
Name of the file, where the output from the spawned process will be written. If this file doesn't exist, it will be created.
Note: If this configuration is not empty, the output is written regardless of the value of expect.loguser.
資源類型
expect_popen() returns an open PTY stream used by expect_expectl().
預設常數
以下常數由擴充功能定義,因此只有在擴充功能被編譯到 PHP 中,或者在執行時被動態載入後才有效。
- EXP_GLOB (integer)
- Indicates that the pattern is a glob-style string pattern.
- EXP_EXACT (integer)
- Indicates that the pattern is an exact string.
- EXP_REGEXP (integer)
- Indicates that the pattern is a regexp-style string pattern.
- EXP_EOF (integer)
- Value, returned by expect_expectl(), when EOF is reached.
- EXP_TIMEOUT (integer)
- Value, returned by expect_expectl() upon timeout of seconds, specified in value of expect.timeout
- EXP_FULLBUFFER (integer)
- Value, returned by expect_expectl() if no pattern have been matched.
範例
This example connects to the remote host via SSH, and prints the remote uptime.
Example#1 Expect Usage Example
<?php
ini_set ("expect.loguser", "Off");
$stream = fopen ("expect://ssh root@remotehost uptime", "r");
$cases = array (
array (0 => "password:", 1 => PASSWORD)
);
switch (expect_expectl ($stream, $cases)) {
case PASSWORD:
fwrite ($stream, "password\n");
break;
default:
die ("Error was occurred while connecting to the remote host!\n");
}
while ($line = fgets ($stream)) {
print $line;
}
fclose ($stream);
?>
The following example connects to the remote host, determines whether installed OS is for 32 or 64 bit, then runs update for specific package.
Example#2 Another Expect Usage Example
<?php
ini_set ("expect.timeout", -1);
ini_set ("expect.loguser", "Off");
$stream = expect_popen ("ssh root@remotehost");
while (true) {
switch (expect_expectl ($stream, array (
array ("password:", PASSWORD), // SSH is asking for password
array ("yes/no)?", YESNO), // SSH is asking whether to store the host entry
array ("~$ ", SHELL, EXP_EXACT), // We've got the shell!
))) {
case PASSWORD:
fwrite ($stream, "secret\n");
break;
case YESNO:
fwrite ($stream, "yes\n");
break;
case SHELL:
fwrite ($stream, "uname -a\n");
while (true) {
switch (expect_expectl ($stream, array (
array ("~$ ", SHELL, EXP_EXACT), // We've got the shell!
array ("^Linux.*$", UNAME, EXP_REGEXP), // uname -a output
), $match)) {
case UNAME:
$uname .= $match[0];
break;
case SHELL:
// Run update:
if (strstr ($uname, "x86_64")) {
fwrite ($stream, "rpm -Uhv https://mirrorsite/somepath/some_64bit.rpm\n");
} else {
fwrite ($stream, "rpm -Uhv https://mirrorsite/somepath/some_32bit.rpm\n");
}
fwrite ($stream, "exit\n");
break 2;
case EXP_TIMEOUT:
case EXP_EOF:
break 2;
default:
die ("Error has occurred!\n");
}
}
break 2;
case EXP_TIMEOUT:
case EXP_EOF:
break 2;
default:
die ("Error has occurred!\n");
}
}
fclose ($stream);
?>
Table of Contents
- expect_expectl — Waits until the output from a process matches one of the patterns, a specified time period has passed, or an EOF is seen
- expect_popen — Execute command via Bourne shell, and open the PTY stream to the process