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()



ssh2_exec
tabber dot watts at gmail dot com
02-Dec-2005 03: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
07-Sep-2005 10: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 05: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)){
..........................................
}

<ssh2_connectssh2_fetch_stream>
 Last updated: Tue, 15 Nov 2005