PHP exec() 在输出中不返回错误消息

2022-08-30 10:43:38

我正在尝试以XML格式获取svn命令的某些输出。当我键入有效参数时,输出正常。但是,当我输入错误的密码时,输出不会显示错误消息。这是 PHP 代码:

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output);

这是我在终端中得到的输出:

<?xml version="1.0"?>
<log>
svn: OPTIONS of 'http://a51.unfuddle.com/svn/a51_activecollab': authorization failed: Could not authenticate to server: rejected Basic challenge (http://a51.unfuddle.com)

以下是我从$output变量中获得的输出,其中包含var_dump:

array(2) {
[0]=>
string(21) "<?xml version="1.0"?>"
[1]=>
string(5) "<log>"
}

如您所见,$output变量不返回第三行输出,而终端则返回。请帮助我获得与终端相同的输出(我甚至尝试使用shell_exec()或system()方法,但它们返回与exec()相同的输出)如何获得完整输出?提前感谢您!


答案 1

你也需要捕捉。stderr

重定向到应该可以解决问题。附加到命令的末尾。stderrstdout2>&1

例如:

exec("/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/ 2>&1", $output);

如果它是一个复杂的命令(例如,一个带有管道的命令,比如做一个mysqldump并将其传递给gzip,然后重定向到文件),创建一个子shell来捕获整体标准错误并将其重定向到标准输出:mysqldump ... | gzip > db.sql.gz

exec('( error_command | cat >/dev/null ) 2>&1', $output)
#     ^                                ^   ^
#     `-- sub-shell with the command --´   `-- stderr to $output

答案 2

这可能不是解决方案,只是一个不好的建议:您是否尝试过在命令中添加额外的回显:

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/;**echo ""**', $output);

另一种解决这个问题的方法如前所述:如果您在$output中没有最后一行,那么无论如何它都在exec()函数的返回值中。然后你就会有

$totalOutput = push($msg,$output);

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output);

推荐