phpseclib ssh exec回调不起作用

时间:2016-03-08 10:14:48

标签: php ssh phpseclib

我使用phpseclib从Web浏览器SSH到我的远程服务器并执行php文件。以下是我使用的代码:

$ssh->exec('cd myfolder/; php main.php ' . $file, 'packet_handler');
function packet_handler(){
    echo "Completed";
     header("Location: exec_completed.php");
}

main.php文件执行没有任何问题。问题是在执行后返回数据。我有以下问题:

  1. 我在main.php文件中做了很多处理,我需要显示脚本的实时进度。当我通过 exec 执行文件时,只打印main.php中的第一个echo并执行停止。有没有办法从执行脚本中获取实时数据。

  2. 虽然我的回调函数packet_handler在exec执行后没有运行,但是我从phpseclib中跟随这个example进行回调。一旦我通过SSH执行的main.php完成执行,我想重定向到另一个页面。现在,如果我重定向到该页面,我只获得部分结果,因为main.php文件尚未完成执行。我尝试使用sleep(10)但是我的main.php可能需要更长的时间来执行,所以它不起作用。请提出任何想法

  3. 来自phpseclib的回调示例:

    <?php
    include('Net/SSH2.php');
    
    $ssh = new Net_SSH2('www.domain.tld');
    if (!$ssh->login('username', 'password')) {
        exit('Login Failed');
    }
    
    function packet_handler($str)
    {
        echo $str;
    }
    
    $ssh->exec('ping 127.0.0.1', 'packet_handler');
    ?>
    

1 个答案:

答案 0 :(得分:1)

对于#1 ...在没有回调的情况下进行$ssh->exec应该有效。如果不是,我需要查看日志,您可以通过顶部define('NET_SSH2_LOGGGING', 2)然后echo $ssh->getLog()查看日志。在pastebin.com上发布日志然后发布链接会很好。但是那说,那也不会让你获得实时输出。

对于#2 ...回调函数主要用于实时更新,并且每次调用回调函数时你得到的几率很可能是输出不完整。因此,对于您的回调输出“已完成”并将用户重定向到另一个位置,很可能是不正确的。

另一种可能适合您的方法:使用交互式shell。例如:

http://phpseclib.sourceforge.net/ssh/examples.html#sudo

我不知道你的输出是什么样的。也许你可以read(),直到你得到保证输出的输出的某些部分。或者也许您可以使用$ssh->setTimeout(5)并每隔五秒钟获得更新的输出......