【发布时间】:2018-07-25 06:12:58
【问题描述】:
我尝试了不同的 SSH 库,但它们在 Laravel 中似乎不太好用。由于我让 phpseclib 运行良好,我正在努力坚持下去。但是,我没有看到从 SSH 连接获得实时输出的方法。
我计划运行的某些事情可能需要几个小时才能完成,但被访问的软件总是会打印出我想在浏览器中显示的完成百分比。
目前,我有这个:
<?php
use phpseclib\Net\SSH2;
use phpseclib\Crypt\RSA;
$key = new RSA();
$key->loadKey(file_get_contents('key.pem'));
$command = 'ping google.com';
$ssh = new SSH2('awesomeserver.com');
if (!$ssh->login('username', $key))
{
echo 'Login Failed';
}
else
{
echo $ssh->exec($command);
}
?>
这只是等待命令完成,然后将其全部显示到屏幕上。
以前,在 else 括号中,我有
while(@ob_end_flush());
$proc = $ssh->exec($command);
while(!feof($proc))
{
echo fread($proc, 4096);
@ flush();
}
但是,$proc 只被识别为字符串而不是资源,所以它不起作用。
除了使用不同的库之外,你们还有其他建议吗?
谢谢!
编辑(部分解决方案):
我最终通过使用 read() 函数来让这个脚本工作:
while(@ob_end_flush());
$ssh->write($command.'\n');
while($read = $ssh->read())
{
echo $read;
@ flush();
}
【问题讨论】:
-
您的部分解决方案也适用于我,只是每次回显和循环之间需要大约 10 秒,而如果自上次回显以来没有任何输出,则退出。我试图设置
$ssh->setTimeout(1),但一旦在那一秒内没有输出任何内容,它就会退出循环。我想知道如何让它每 1 或 2 秒检查一次,并且在一切都说完并完成之前不退出循环......也许检查循环条件中的提示......
标签: php laravel ssh real-time phpseclib