Expect Functions
Introducere
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.
Necesităţi
This module uses the functions of the » expect library. You need libexpect version >= 5.43.0.
Instalarea
Această extensie » PECL nu este încorporată în PHP. Informaţie despre instalarea acestei extensii PECL poate fi găsită în capitolul manualului, întitulat Instalarea extensiilor PECL. Informaţii adiţionale, cum ar fi lansări noi, descărcări, fişiere-sursă, informaţii despre persoana care întreţine extensia şi istoria schimbărilor poate fi localizată aici: » https://pecl.php.net/package/expect.
În PHP 4 sursa acestei extensii PECL poate fi găsită în directorul ext/ din sursa PHP, sau la referinţa PECL de mai sus. 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. În PHP 4 acest DLL se află în directorul extensions/ al distributivului PHP pentru Windows. Biblioteca DLL pentru această extensie PECL poate fi descărcată de pe pagina » PHP Downloads sau de pe » https://pecl4win.php.net/
Configuraţia la rulare
Comportamentul acestor funcţii este afectat de parametrii stabiliţi în php.ini.
In order to configure expect extension, there are configuration options in the configuration file php.ini.
Denumirea | Valoarea implicită | Poate fi modificată | Changelog |
---|---|---|---|
expect.timeout | "10" | PHP_INI_ALL | |
expect.loguser | "1" | PHP_INI_ALL | |
expect.logfile | "" | PHP_INI_ALL |
Iată o explicaţie pe scurt a directivelor de configurare.
- 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.
Notă: 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.
Notă: If this configuration is not empty, the output is written regardless of the value of expect.loguser.
Tipurile resurselor
expect_popen() returns an open PTY stream used by expect_expectl().
Constante predefinite
Constantele de mai jos sunt definite de această extensie şi vor fi disponibile doar dacă această extensie a fost compilată în interiorul PHP, sau a fost încărcată dinamic în timpul rulării.
- 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.
Exemple
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);
?>
Cuprins
- 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