PHP Conference Japan 2024

ssh2_fetch_stream

(PECL ssh2 >= 0.9.0)

ssh2_fetch_stream获取扩展数据流

描述

ssh2_fetch_stream(资源 $channel, 整数 $streamid): 资源

获取与 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 条注释

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;
?>
Ricardo Striquer (ricardophp yohoocombr)
17 年前
我有一个朋友在使用这些函数,但他无法使用这个 ssh2_fetch_stream 函数。首先,我得到了 webmaster at spectreanime dot com 提供的 ssh2_shell 示例,但此函数不适用于他的示例,我相信这是因为他使用 fwrite 而不是 ssh2_shell 或 ssh2_exec 来运行命令。

下面的示例是在命令行下运行的,并且完全有效。请注意,我根据 webmaster at spectreanime dot com 的建议添加了 sleep。

<?php
echo "SSH 连接 ";
if (!(
$connection=@ssh2_connect("69.69.69.69", 22))) {
echo
"[失败]\n";
exit(
1);
}
echo
"[成功]\n身份验证 ";

if (!@
ssh2_auth_password($connection,"root","YourPassword")) {
echo
"[失败]\n";
exit(
1);
}
echo
"[成功]\n";

$stdout_stream = ssh2_exec($connection, "/bin/lssss -la /tmp");
sleep(1);
$stderr_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);

echo
"发现错误!\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);
?>
hexer
16 年前
我在 PHP4 中成功使用了 fgets

示例

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

$str = fgets(ssh2_fetch_stream($channel, SSH2_STREAM_STDIO), 8192);
?>
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