PHP ssh2_shell 执行命令并获得响应

标签 php linux bash shell libssh2

我正在连接到 ssh 服务器并使用 ssh2_shell 创建交互式 bash shell。

我遇到的问题是如何向 shell 发送命令并准确获取命令的响应。

这是我目前正在做的:

$stream = ssh2_connect();
$shell = ssh2_shell($stream, 'bash');

fwrite($shell, "whoami\n");
fwrite(STDOUT, fread($shell, 2048) . PHP_EOL);

上述代码的问题是 STDOUT(用于命令行 View )的输出显示类似Last login to server etc.. 也就是欢迎消息。我必须等待一两秒钟,然后再次从 shell 读取以获取我发送的命令的输出。

现在我可以通过在发送任何命令后执行 sleep(1) 来解决这个问题,但这非常 hacky。如果命令花费的时间超过一秒,我将不会得到结果。如果命令用时不到一秒,我就是在浪费时间。

我在编写命令和调用 fread 之前尝试了 stream_set_blocking($shell, true) 但问题仍然存在,除非我在命令后 sleep 。

基本上,我如何使用 ssh2_shell,发送命令并获得该命令的响应,而不管它需要多长时间,而不会在 shell 返回其内容后通过请求阻塞流的内容使脚本超时?

最佳答案

您所描述的是 ssh2_shell 的预期行为 - 它是交互式的。这意味着您需要处理超时。

如果您希望在远程主机上执行命令或脚本并只接收其输出,您需要非交互式执行 - ssh2_exec。

关于PHP ssh2_shell 执行命令并获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31474089/

相关文章:

php - MySQL:在一条语句中选择项目的类别和(可选)子类别

PHP 在主项目的vendor下开发一个composer包

php - 如何让我的服务器与 iPhone 应用程序一起工作?

windows - 跨多个平台维护多个数据库

regex - 使用 sed 一个接一个地添加一个文本 block

c - 如何使用管道在线程之间发送数组?

从命令行传递字符串时的 Bash 怪癖

Phpinfo() 在 NginX 上更新后显示旧的 PHP 版本

linux - 如何使用 awk bash 根据日期进行调用

linux - 查找并替换 .htaccess 代码