【问题标题】:Real-time SSH output in Laravel with phpseclib使用 phpseclib 在 Laravel 中实时 SSH 输出
【发布时间】: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-&gt;setTimeout(1),但一旦在那一秒内没有输出任何内容,它就会退出循环。我想知道如何让它每 1 或 2 秒检查一次,并且在一切都说完并完成之前不退出循环......也许检查循环条件中的提示......

标签: php laravel ssh real-time phpseclib


【解决方案1】:

您可以使用回拨电话。例如。

$ssh->exec('ping 127.0.0.1', function($output) {
    echo $output;
});

【讨论】:

  • 我做到了。不幸的是,它会等到给出完整的响应后才输出。由于我正在运行运行数小时的程序,每隔几秒进行一次更新,我只会得到一个超时错误。
  • @Cod-nerd - flush() / ob_flush() 可能会有所帮助,但最终这将取决于您使用的网络服务器(Apache、nginx 等)、您使用的 SAPI(CGI , Apache 模块等)等。
  • 这不适用于exec() 函数。但是,它确实适用于 read() 函数。但是,我的服务器现在超时了脚本。哈哈!不过没关系。无论如何,我不应该让 PHP 脚本运行那么长时间。
猜你喜欢
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2014-09-17
  • 2017-05-25
  • 1970-01-01
相关资源
最近更新 更多