php-doc-en/reference/expect/reference.xml

180 lines
4.8 KiB
XML
Raw Normal View History

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.9 $ -->
<!-- Purpose: fileprocess.process -->
<!-- Membership: pecl -->
<reference xml:id="ref.expect" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Expect Functions</title>
<titleabbrev>Expect</titleabbrev>
<partintro>
<section xml:id="expect.intro">
&reftitle.intro;
<para>
This extension allows to interact with processes through PTY. You may
consider using the <link linkend="wrappers.expect"><literal>expect://</literal>
wrapper</link> with the <link linkend="ref.filesystem">filesystem
functions</link> which provide a simpler and more intuitive interface.
</para>
</section>
<section xml:id="expect.requirements">
&reftitle.required;
<para>
This module uses the functions of the <link
xlink:href="&url.expect;">expect</link> library.
You need libexpect version &gt;= 5.43.0.
</para>
</section>
&reference.expect.configure;
&reference.expect.ini;
<section xml:id="expect.resources">
&reftitle.resources;
<para>
<function>expect_popen</function> returns an open PTY stream used by
<function>expect_expectl</function>.
</para>
</section>
&reference.expect.constants;
<section xml:id="expect.examples">
&reftitle.examples;
<para>
This example connects to the remote host via SSH, and prints the remote
uptime.
</para>
<example>
<title>Expect Usage Example</title>
<programlisting role="php">
<![CDATA[
<?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);
?>
]]>
</programlisting>
</example>
<para>
The following example connects to the remote host, determines whether
installed OS is for 32 or 64 bit, then runs update for specific package.
</para>
<example>
<title>Another Expect Usage Example</title>
<programlisting role="php">
<![CDATA[
<?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 http://mirrorsite/somepath/some_64bit.rpm\n");
} else {
fwrite ($stream, "rpm -Uhv http://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);
?>
]]>
</programlisting>
</example>
</section>
</partintro>
&reference.expect.entities.functions;
</reference>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->