作为www数据运行时,unoconv返回错误



当以root的形式从命令行运行此程序时,它可以使用

unoconv -f csv $file

但当它作为www-data运行时,这个错误会返回

Traceback (most recent call last):
  File "/usr/bin/unoconv", line 1114, in <module>
    office_environ(of)
  File "/usr/bin/unoconv", line 203, in office_environ
    os.environ['PATH'] = realpath(office.basepath, 'program') + os.pathsep + os.environ['PATH']
  File "/usr/lib/python3.4/os.py", line 633, in __getitem__
    raise KeyError(key) from None
KeyError: 'PATH'

更新

echo shell_exec('echo $PATH');
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

centos 7.3通过php-fpm使用phpphp中的env由php fpm 清理

u可以使用putenv在php代码中设置evn["PATH"],例如

putenv("PATH=/sbin:/bin:/usr/sbin:/usr/bin"); 
var_dump(shell_exec('unoconv -vvvv -f pdf -o 123.pdf 123.doc));

或者u可以使用单行shell cmd 设置env

var_dump(shell_exec('PATH=/sbin:/bin:/usr/sbin:/usr/bin'.' unoconv -vvvv -f pdf -o 123.pdf 123.doc));

或者u可以更改/etc/php-fpm.d/www.conf将env传递给php,添加此行

clean_env = no

和重新启动php fpm

systemctl restart php-fpm.service

您使用的PHP调用(从聊天中粘贴):

exec("unoconv -f csv $file")

我的猜测是exec()给你的环境太有限了。要解决此问题,您可以设置一个轮询目录。PHP脚本会将要转换的文件复制到轮询目录中,然后等待文件转换。

然后创建一个bash脚本(以root用户或更安全的用户身份运行)以在无限循环中运行,并检查轮询目录中是否有任何传入文件。有关bash脚本的外观,请参阅如何在文件到达Unix之前一直在目录中轮询文件。

当bash脚本看到传入文件时,它会运行unoconv。

通过直接运行libreoffice 自己找到了一个解决方案

sudo libreoffice --headless --convert-to csv --outdir $tmp_path $file

最新更新