我正在连接到 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/