phpseclib ssh exec 回调不起作用


phpseclib ssh exec callback not working

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

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

主.php文件可以毫无问题地执行。问题在于执行后返回数据。我有以下问题:

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

  2. 我遵循 phpseclib 的这个例子进行回调,尽管我的回调函数packet_handler在执行 exec 后没有运行。我想在通过SSH执行的主页面完成后重定向到另一个页面.php我完成了执行。现在,如果我重定向到该页面,我只会得到部分结果,因为主文件.php文件尚未完成其执行。我尝试使用 sleep(10),但我的主要.php有时可能需要更长的时间来执行,所以它不起作用。请提出任何想法

来自 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... 在没有回调的情况下执行$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)并每五秒更新一次输出。