ssh2_fetch_stream

(PECL ssh2 >= 0.9.0)

ssh2_fetch_stream获取扩展数据流

说明

ssh2_fetch_stream(resource $channel, int $streamid): resource

获取与 SSH2 通道流关联的备用子流。SSH2 协议目前只定义了一个子流,STDERR,它的子流 ID 为 SSH2_STREAM_STDERR(定义为 1)。

参数

channel

streamid

一个 SSH2 通道流。

返回值

返回请求的流资源。

范例

范例 #1 打开一个 shell 并检索与之关联的 stderr 流

<?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);
?>

参见

添加备注

用户贡献的备注 4 备注

7
ingo at baab dot de
4 年前
除了 Dennis K. 13 年前的最后一次发帖外,我还修正了两个拼写错误(常量 SSH2_STREAM_STDIO 拼写错误)并删除了(太多)括号 - 此代码有效

<?php
$stdout_stream
= ssh2_exec($connection, "lssss -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;
?>
-1
Ricardo Striquer (ricardophp yohoocombr)
17 年前
我有一个朋友使用这些函数,但他无法使用这个 ssh2_fetch_stream 函数。首先我从 webmaster at spectreanime dot com 那里获得了 ssh2_shell 示例,但这个函数无法与他的示例一起使用,我认为这是因为他使用了 fwrite 而不是 ssh2_shell 或 ssh2_exec 来运行命令。

下面的示例将在命令行下运行,并且完全正常。请注意,我添加了 sleep,如 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);
?>
-1
hexer
15 年前
我在 PHP4 中成功使用了 fgets

示例

<?php
$stderr
= fgets(ssh2_fetch_stream($channel, SSH2_STREAM_STDERR), 8192);

$str = fgets(ssh2_fetch_stream($channel, SSH2_STREAM_STDIO), 8192);
?>
-2
Dennis K.
17 年前
除了 Ricardo Striquer 的最后一次发帖外

使用 stream_set_blocking() 简单地阻止流,你就不必 sleep() 脚本...

<?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));
?>
To Top