文字

Expect Usage Examples

Example #1 Expect Usage Example

This example connects to the remote host via SSH, and prints the remote uptime.

<?php
ini_set
( "expect.loguser" "Off" );

$stream  fopen ( "expect://ssh root@remotehost uptime" "r" );

$cases  = array (
    array (
=>  "password:" =>  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 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 );
?>

用户评论:

[#1] David dkxl [2012-12-28 18:30:28]

If using the examples with telnet instead of ssh, note that telnet may need \r (Carriage Return) instead of \n (New Line)

上一篇: 下一篇: