我正在连接到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
(对于命令行视图)显示类似Last login to server etc..
的欢迎消息。我必须等待一两秒,然后再次从shell中读取以获取我发送的命令的输出。
现在我可以在发送任何命令后执行sleep(1)
来解决这个问题,但这非常hacky。如果命令花费的时间超过一秒,我将无法得到结果。如果命令花了不到一秒钟,我就浪费时间了。
我在编写命令并调用stream_set_blocking($shell, true)
之前尝试fread
但问题仍然存在,除非我在命令之后睡觉。
基本上,我如何使用ssh2_shell,发送命令并获取该命令的响应,而不管它将花费多长时间,而不是在shell返回其内容后通过请求阻塞流的内容来超时脚本? / p>
答案 0 :(得分:0)
您描述的是ssh2_shell的预期行为 - 它是交互式的。这意味着你需要处理超时。
如果您希望在远程主机上执行命令或脚本并只接收其输出,则需要非交互式执行 - ssh2_exec。