PHP Conference Japan 2024

expect_expectl

(PECL expect >= 0.1.0)

expect_expectl等待进程的输出与其中一个模式匹配,或者经过指定的时间段,或者看到 EOF

描述

expect_expectl(资源 $expect, 数组 $cases, 数组 &$match = ?): int

等待进程的输出与其中一个模式匹配,或者经过指定的时间段,或者看到 EOF

如果提供 match,则它将填充搜索结果。匹配的字符串可以在 match[0] 中找到。匹配的子字符串(根据括号)可以在原始模式的 match[1]match[2] 等中找到,直到 match[9](libexpect 的限制)。

参数

expect

一个 Expect 流,之前使用 expect_popen() 打开。

cases

一个 Expect 案例数组。每个 Expect 案例都是一个索引数组,如下表所述

Expect 案例数组
索引键 值类型 描述 是否必须 默认值
0 字符串 模式,将与流的输出进行匹配  
1 混合 值,如果模式匹配,则此函数将返回该值  
2 整数 模式类型,其中之一:EXP_GLOBEXP_EXACTEXP_REGEXP EXP_GLOB

返回值

返回与匹配的模式关联的值。

如果失败,此函数将返回:EXP_EOFEXP_TIMEOUTEXP_FULLBUFFER

变更日志

版本 描述
PECL expect 0.2.1 在 0.2.1 版本之前,在 match 参数中返回匹配字符串,而不是匹配子字符串数组。

范例

示例 #1 expect_expectl() 示例

<?php
// 从远程主机复制文件:
ini_set("expect.timeout", 30);

$stream = fopen("expect://scp user@remotehost:/var/log/messages /home/user/messages.txt", "r");

$cases = array(
// array(pattern, value to return if pattern matched)
array("password:", "asked for password"),
array(
"yes/no)?", "asked for yes/no")
);

while (
true) {
switch (
expect_expectl($stream, $cases)) {
case
"asked for password":
fwrite($stream, "my password\n");
break;
case
"asked for yes/no":
fwrite($stream, "yes\n");
break;
case
EXP_TIMEOUT:
case
EXP_EOF:
break
2; // break both the switch statement and the while loop
default:
die(
"发生错误!");
}
}

fclose($stream);
?>

参见

  • expect_popen() - 通过 Bourne shell 执行命令,并打开到进程的 PTY 流

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top