|
|
ssh2_exec (PECL) ssh2_exec --
Execute a command on a remote server
Descriptionresource 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()
Betsy Gamrat
15-Apr-2007 07:52
It is also good to use register_shutdown_function to shred the keys after this runs.
Jon-Eirik Pettersen
11-Mar-2007 05:33
The command may not finish before the function return if the stream is not set to blocking mode. You may have to set the stream to blocking mode in order to get any output from the command.
<?php
$stream = ssh2_exec($connection, 'ps ax');
stream_set_blocking($stream, true);
$output = stream_get_contents($stream);
?>
Betsy Gamrat
18-Feb-2007 12:00
If the ssh2_exec takes awhile to run, and you need a handshake, you can use a file. In this case, $flag names a handshake file that is written when the ssh script finishes.
$stream = ssh2_exec($connection, $command . " $public_key $private_key;");
$i=0;
while (!file_exists ($flag) && ($i < MAX_TIME))
{
sleep(1);
$i++;
}
$ret_val=($stream!=FALSE);
This is an extract out of the bash script that is running. Be sure to allow the webserver permission to read the file that the script writes.
echo 0 > $OUTFILE
chmod 666 $OUTFILE
One other note: you can put more than one command in by separating them with ';' (semicolons).
col at pobox dot com
15-Oct-2006 03: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
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");
$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; 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
$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)){
..........................................
}
|