PHP Conference Japan 2024

expect_expectl

(PECL expect >= 0.1.0)

expect_expectl等待來自行程的輸出符合其中一種模式、指定的時段已過或看到檔案結尾 (EOF)

描述

expect_expectl(資源 $expect, 陣列 $cases, 陣列 &$match = ?): 整數

等待來自行程的輸出符合其中一種模式、指定的時段已過或看到檔案結尾 (EOF)。

如果提供了 match 參數,則它會被填入搜尋的結果。匹配的字串可以在 match[0] 中找到。原始模式中符合的子字串(根據括號)可以在 match[1]match[2] 等位置找到,最多到 match[9](libexpect 的限制)。

參數

expect

一個 Expect 串流,先前已使用 expect_popen() 開啟。

cases

一個 expect 案例的陣列。每個 expect 案例都是一個索引陣列,如下表所述

Expect 案例陣列
索引鍵 值類型 描述 是否必要 預設值
0 string(字串) 將與串流輸出比對的模式  
1 mixed(混合) 如果模式匹配,此函式將返回的值  
2 integer(整數) 模式類型,其中之一: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(比對模式, 模式符合時回傳的值)
array("password:", "要求輸入密碼"),
array(
"yes/no)?", "要求輸入yes/no")
);

while (
true) {
switch (
expect_expectl($stream, $cases)) {
case
"要求輸入密碼":
fwrite($stream, "my password\n");
break;
case
"要求輸入yes/no":
fwrite($stream, "yes\n");
break;
case
EXP_TIMEOUT:
case
EXP_EOF:
break
2; // 跳出 switch 敘述和 while 迴圈
default:
die(
"發生錯誤!");
}
}

fclose($stream);
?>

另請參閱

  • expect_popen() - 透過 Bourne shell 執行指令,並開啟與該程序的 PTY 串流

新增註記

使用者提供的註記

此頁面沒有使用者提供的註記。
To Top