ssh2_fetch_stream
(PECL ssh2 >= 0.9.0)
ssh2_fetch_stream — Fetch an extended data stream
Description
resource ssh2_fetch_stream
( resource
$channel
, int $streamid
)
Fetches an alternate substream associated with an SSH2 channel stream.
The SSH2 protocol currently defines only one substream, STDERR, which has
a substream ID of SSH2_STREAM_STDERR
(defined as 1).
Parameters
-
channel
-
-
streamid
-
An SSH2 channel stream.
Return Values
Returns the requested stream resource.
Examples
Example #1 Opening a shell and retrieving the stderr stream associated with it
<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$stdio_stream = ssh2_shell($connection);
$stderr_stream = ssh2_fetch_stream($stdio_stream, SSH2_STREAM_STDERR);
?>
See Also
- ssh2_shell() - Request an interactive shell
- ssh2_exec() - Execute a command on a remote server
- ssh2_connect() - Connect to an SSH server
- ssh2_auth_agent
- ssh2_auth_hostbased_file
- ssh2_auth_none
- ssh2_auth_password
- ssh2_auth_pubkey_file
- ssh2_connect
- ssh2_exec
- ssh2_fetch_stream
- ssh2_fingerprint
- ssh2_methods_negotiated
- ssh2_publickey_add
- ssh2_publickey_init
- ssh2_publickey_list
- ssh2_publickey_remove
- ssh2_scp_recv
- ssh2_scp_send
- ssh2_sftp_chmod
- ssh2_sftp_lstat
- ssh2_sftp_mkdir
- ssh2_sftp_readlink
- ssh2_sftp_realpath
- ssh2_sftp_rename
- ssh2_sftp_rmdir
- ssh2_sftp_stat
- ssh2_sftp_symlink
- ssh2_sftp_unlink
- ssh2_sftp
- ssh2_shell
- ssh2_tunnel
Коментарии
I got a friend using those functions and he was not able to use this ssh2_fetch_stream function. First of all I got the ssh2_shell sample by webmaster at spectreanime dot com, but this function does not work with his sample, i believe thats because he use fwrite instead of ssh2_shell or ssh2_exec to run the command.
This sample below is to run under a command line and is fully functional. note that i add the sleep as advised by webmaster at spectreanime dot com
<?php
echo "Connexion SSH ";
if (!($connection=@ssh2_connect("69.69.69.69", 22))) {
echo "[FAILED]\n";
exit(1);
}
echo "[OK]\nAuthentification ";
if (!@ssh2_auth_password($connection,"root","YourPassword")) {
echo "[FAILED]\n";
exit(1);
}
echo "[OK]\n";
$stdout_stream = ssh2_exec($connection, "/bin/lssss -la /tmp");
sleep(1);
$stderr_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);
echo "Erros encontrados!\n------------\n";
while($line = fgets($stderr_stream)) { flush(); echo $line."\n"; }
echo "------------\n";
while($line = fgets($stdout_stream)) { flush(); echo $line."\n";}
fclose($stdout_stream);
?>
In addition to the last post from Ricardo Striquer:
Simple block the stream with stream_set_blocking(), and you dont have to sleep() the script...
<?php
stdout_stream = ssh2_exec($connection, "/bin/lssss -la /tmp");
$err_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);
$dio_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDDIO);
stream_set_blocking($err_stream, true);
stream_set_blocking($dio_stream, true);
$result_err = stream_get_contents($err_stream));
$result_dio = stream_get_contents($dio_stream));
?>
I successfully used fgets in PHP4
examples
<?php
$stderr = fgets(ssh2_fetch_stream($channel, SSH2_STREAM_STDERR), 8192);
$str = fgets(ssh2_fetch_stream($channel, SSH2_STREAM_STDIO), 8192);
?>
In addition to the last post (13 years ago) from Dennis K. I corrected two typos (constant SSH2_STREAM_STDIO was misspellt) and removed (too many) brackets - this code works:
<?php
$stdout_stream = ssh2_exec($connection, "lsssss -la");
$sio_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDIO);
$err_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);
stream_set_blocking($sio_stream, true);
stream_set_blocking($err_stream, true);
$result_dio = stream_get_contents($sio_stream);
$result_err = stream_get_contents($err_stream);
echo 'stderr: ' . $result_err;
echo 'stdio : ' . $result_dio;
?>