【问题标题】:phpseclib ssh exec callback not workingphpseclib ssh exec回调不起作用
【发布时间】:2016-03-08 10:14:47
【问题描述】:

我使用 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. 我遵循 phpseclib 中的 example 进行回调,尽管我的回调函数 packet_handler 在 exec 执行后没有运行。一旦我通过 SSH 执行的 main.php 完成执行,我想重定向到另一个页面。现在,如果我重定向到该页面,我只会得到部分结果,因为 main.php 文件尚未完成其执行。我尝试使用 sleep(10) 但我的 main.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');
?>

【问题讨论】:

    标签: php ssh phpseclib


    【解决方案1】:

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

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

    另一种可能对您有用的方法:使用交互式外壳。示例:

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

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

    【讨论】:

    • 感谢您的帮助。我现在没有包括回调。这是我的日志输出。 pastebin.com/PzKe5sUv 我看到我在 main.php 文件中回显的数据在日志中可用,但在我执行时它们不显示。关于我的文件的输出:我解析了一个 csv 文件并使用该解析的数据对 Web 服务执行肥皂调用并显示结果。我尝试使用 if(read('my final echo'){ redirect to another file;} 但无论我给出什么字符串,它都会执行。我如何使用 read() 来发现 main.php 已完成执行。
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 2013-12-11
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2017-03-04
    相关资源
    最近更新 更多