Unoconv工作从终端使用www-data,但不是从PHP脚本也作为www-data


unoconv works from terminal using www-data but not from php script also as www-data

我用php编写了以下函数

public static function convert($originFilePath, $outputDirPath, $toFormat)
{
    $command = 'echo $PATH & UNO_PATH=/usr/lib/libreoffice unoconv --format %s --output %s %s';
    $command = sprintf($command, $toFormat, $outputDirPath, $originFilePath);
    exec($command, $output, $result_var);
    return compact('output', 'result_var', 'outputDirPath', 'originFilePath', 'toFormat');
}

没有生成任何错误信息,也没有生成任何pdf文件。

在终端中,当我将unconv直接作为www-data运行时,没有任何问题。

这是我执行后的结果:

2013-05-26 03:05:30 Error: Array
(
    [output] => Array
        (
            [0] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
        )
    [result_var] => 1
    [outputDirPath] => /var/virtual/storyzer.com/cake-json/ltequotationapp/webroot/outputfiles/Excel/2
    [originFilePath] => /var/virtual/storyzer.com/cake-json/ltequotationapp/webroot/outputfiles/Excel/2/dsadas.xlsx
    [toFormat] => pdf
)

请建议。

问题是我正在使用Nginx和PHP-FPM。

在Nginx中PATH是默认不声明的

所以有两个解

1)在Nginx的fastcgi参数中声明。

2)在运行unoconv代码之前使用putenv()在脚本中声明它。

putenv('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/node/bin');

我还想补充的是,某种故障排除方法帮助我认识到这个问题。看到这里。

关于可能的解决方案,请参阅此处。

节选自…

这是我所做的,使unoconv工作通过apache/php代码运行在Cent OS 6.2 (unoconv版本0.6和LibreOffice 3.4.5.2):(这只是一个变通办法,根本原因我不知道)

将apache用户从/sbin/nologin更改为/bin/bash(在/etc/passwd文件中完成)添加新用户unoconv新增文件/etc/sudoers.D/unconv,包含以下内容:

apache ALL=(unoconv) NOPASSWD:/usr/bin/unoconv(注意,我的unoconv程序在这个位置/usr/bin/unoconv -你可以使用哪个unoconv找到它)

使用visudo注释掉后面的行(通过在行首添加#)

#违约requiretty

重启sshd和httpd服务

像这样用php exec()函数运行unoconv(你需要改变输入文件名和输出目录):

exec('sudo -u unoconv/usr/bin/unoconv -f pdf -o bankgenerated Teacher_bulk_upload.csv');

希望这对你有用

我有同样的问题,并通过添加两个子文件夹来解决它/var/www/unconv

所需的.cache和.config

Env Ubuntu 18.04服务器Apache,unoconv 0.7,posix/linux平台,python 3.6.9(默认,2021年12月8日,21:08:43),(GCC 8.4.0),LibreOffice 6.0.7.3

    user@ip-*-*-*-*:/var/www$ sudo mkdir .cache
    user@ip-*-*-*-*:/var/www$ sudo chown -R www-data:www-data .cache/
    user@ip-*-*-*-*:/var/www$ sudo chmod -R 744 .cache/
    user@ip-*-*-*-*:/var/www$ sudo mkdir .config
    user@ip-*-*-*-*:/var/www$ sudo chown -R www-data:www-data .config/
    user@ip-*-*-*-*:/var/www$ sudo chmod -R 744 .config/

www-data的主目录是/var/www/,默认设置为root用户,unconv不能创建缓存和配置所需的文件夹。

查看你的www-data $HOME

sudo cat /etc/passwd | grep www-data
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

我认为改变/var/www/的权限是不安全的(到www-data用户和组),但可以添加。cache和。config文件夹与www-data权限。让专家来确认一下。

注:生成器返回关于docx版本的错误,但生成了PDF

$command = 'unoconv -f pdf ' . $path.$file;
exec($command, $output);