使用phpseclib在Laravel中实时SSH输出
我尝试了不同的SSH库,但它们在Laravel中似乎工作得不太好。既然我让phpseclib工作得很好,我就努力坚持下去。但是,我没有看到从SSH连接获得实时输出的方法 我计划运行的某些事情可能需要几个小时才能完成,但正在访问的软件总是打印出我希望在浏览器中显示的完成百分比 目前,我有:使用phpseclib在Laravel中实时SSH输出,php,laravel,ssh,real-time,phpseclib,Php,Laravel,Ssh,Real Time,Phpseclib,我尝试了不同的SSH库,但它们在Laravel中似乎工作得不太好。既然我让phpseclib工作得很好,我就努力坚持下去。但是,我没有看到从SSH连接获得实时输出的方法 我计划运行的某些事情可能需要几个小时才能完成,但正在访问的软件总是打印出我希望在浏览器中显示的完成百分比 目前,我有: <?php use phpseclib\Net\SSH2; use phpseclib\Crypt\RSA; $key = new RSA(); $key-&g
<?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);
}
?>
但是,$proc只被识别为一个字符串而不是一个资源,所以它不起作用
除了使用不同的图书馆,你们还有什么其他建议吗
谢谢
编辑部分解决方案:
我最终通过使用read函数实现了这个脚本:
而@ob_end_flush
$proc = $ssh->exec($command);
while(!feof($proc))
{
echo fread($proc, 4096);
@ flush();
}
$ssh->write($command.'\n');
while($read = $ssh->read())
{
echo $read;
@ flush();
}
你可以给员工回电话。例如
$ssh->exec('ping 127.0.0.1', function($output) {
echo $output;
});
我做到了。不幸的是,它会等到给出完整响应后才输出。由于我运行的程序运行数小时,每隔几秒钟就会更新一次,因此我只会得到一个超时错误。@Cod nerd-flush/ob_flush可能会有所帮助,但最终这将取决于您使用的Web服务器Apache、nginx等,您使用的SAPI CGI、Apache模块等与exec函数不兼容。但是,它确实与读取功能一起工作。但是,我的服务器现在超时了脚本。英雄联盟不过没关系。无论如何,我不应该让一个PHP脚本运行那么长时间。你的部分解决方案对我也适用,只是每次回显和循环之间大约需要10秒,如果上次回显后没有输出,则退出。我试图设置$ssh->setTimeout1,但当在那一秒钟内没有输出任何内容时,它就会退出循环。我想知道你怎么能让它每1或2秒检查一次,直到它全部说出来和完成后才退出循环。。。可能检查循环条件中的提示。。。