ssh2_exec

(PECL)

ssh2_exec --  Execute a command on a remote server

Description

resource ssh2_exec ( resource session, string command [, string pty [, array env [, int width [, int height [, int width_height_type]]]]] )

Execute a command at the remote end and allocate a channel for it. Returns a stream on success or FALSE on failure.

例子 1. Executing a command

<?php
$connection
= ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$stream = ssh2_exec($connection, '/usr/local/bin/php -i');
?>

See Also: ssh2_connect(), ssh2_shell(), and ssh2_tunnel()


add a note add a note User Contributed Notes
col at pobox dot com
16-Oct-2006 06:55
as of 0.9 and above, if not allocating a pty, add FALSE to the call...

old way:

ssh2_exec($connection, $command);

new way:

ssh2_exec($connection, $command, FALSE);
tabber dot watts at gmail dot com
03-Dec-2005 07:21
This is the best way I found to automatically run multiple commands or commands that might take longer then expected.  NOTE: this assumes that no where in the output is there the text '[end]' otherwise the function will end prematurely.  Hope this helps people.

<?php
$ip
= 'ip_address';
$user = 'username';
$pass = 'password';

$connection = ssh2_connection($ip);
ssh2_auth_password($connection,$user,$pass);
$shell = ssh2_shell($connection,"bash");

//Trick is in the start and end echos which can be executed in both *nix and windows systems.
//Do add 'cmd /C' to the start of $cmd if on a windows system.
$cmd = "echo '[start]';your commands here;echo '[end]'";
$output = user_exec($shell,$cmd);

fclose($shell);

function
user_exec($shell,$cmd) {
 
fwrite($shell,$cmd . "\n");
 
$output = "";
 
$start = false;
 
$start_time = time();
 
$max_time = 2; //time in seconds
 
while(((time()-$start_time) < $max_time)) {
  
$line = fgets($shell);
   if(!
strstr($line,$cmd)) {
     if(
preg_match('/\[start\]/',$line)) {
      
$start = true;
     }elseif(
preg_match('/\[end\]/',$line)) {
       return
$output;
     }elseif(
$start){
      
$output[] = $line;
     }
   }
  }
}

?>
gakksimian at yahoo dot com
08-Sep-2005 01:15
Executing remote Windows commands...
After some hair pulling, I thought I'd suggest a couple things that might help others:

1. Use 'ssh2_fetch_stream' to open a stderr stream according to the manual.
2. Windows shell commands require 'cmd /C [command]' to execute.  (I had forgotten this)

<?php
  
// code fragment
  
$stdout_stream = ssh2_exec($connection, 'cmd /C dir');
  
$stderr_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);
?>

I didn't realize the need for the 'cmd /C' until I saw the stderr response 'dir: not found'.
yairl at savion dot huji dot ac dot il
09-Jun-2005 08:03
If you want to run many exec orders throught ssh2 in the same process using the same variable $stream for exemple and to read the output for each order, you must close the stream after each order else you will not be able to read the next order output.

 $stream=ssh2_exec($conn_id,"/usr/bin/ls .");
   stream_set_blocking( $stream, true );
   $cmd=fread($stream,4096);
fclose($stream);

if(ereg("public_html",$cmd)){
...........................................
}

 $stream=ssh2_exec($conn_id,"/usr/bin/ls public_html");
   stream_set_blocking( $stream, true );
   $cmd=fread($stream,4096);
fclose($stream);

if(ereg("images",$cmd)){
..........................................
}

 
$stream=ssh2_exec($conn_id,"/usr/bin/ls public_html/images");
   stream_set_blocking( $stream, true );
   $cmd=fread($stream,4096);
fclose($stream);

if(ereg("blabla",$cmd)){
..........................................
}