我使用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文件执行没有任何问题。问题是在执行后返回数据。我有以下问题:
我在main.php文件中做了很多处理,我需要显示脚本的实时进度。当我通过 exec 执行文件时,只打印main.php中的第一个echo并执行停止。有没有办法从执行脚本中获取实时数据。
虽然我的回调函数packet_handler在exec执行后没有运行,但是我从phpseclib中跟随这个example进行回调。一旦我通过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');
?>
答案 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)
并每隔五秒钟获得更新的输出......