Expect Functions
Introduktion
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.
Systemkrav
This module uses the functions of the » expect library. You need libexpect version >= 5.43.0.
Installation
Denne » PECL udvidelse medfølger ikke i PHP. Uddybende information sÃ¥ som nye udgivelser, downloads, kildekoder, vedligeholder information samt en CHANGELOG, kan findes her: » https://pecl.php.net/package/expect.
I PHP 4 er denne PECL udvidelses kildekode kan blive fundet i ext/ biblioteket inde i PHP kildekoden eller ved PECL linket ovenover. 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. I PHP 4 befinder denne DLL sig i extensions/ biblioteket inde i PHP Windows binær download. Du kan hente denne PECL udvidelse DLL fra » PHP Downloads siden eller pÃ¥ » https://snaps.php.net/.
Runtime Konfiguration
Virkemåden af disse funktioner er berørt af indstillinger i php.ini.
In order to configure expect extension, there are configuration options in the configuration file php.ini.
Navn | Standard | Foranderlig | Changelog |
---|---|---|---|
expect.timeout | "10" | PHP_INI_ALL | |
expect.loguser | "1" | PHP_INI_ALL | |
expect.logfile | "" | PHP_INI_ALL |
Her er en kort forklaring på konfigurations-direktiverne.
- 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.
Ressourcetyper
expect_popen() returns an open PTY stream used by expect_expectl().
Foruddefinerede Konstanter
Konstanterne nedenunder er defineret af denne udvidelse, og vil kun være tilgængelige når denne udvidelse enten er blevet kompileret ind i PHP eller dynamisk indsat under runtime.
- 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.
Eksempler
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