Libreoffice --headless 拒绝转换除非使用 root 权限,无法从 PHP 脚本工作。

13

在运行 Ubuntu 12.x 版本的无头服务器上执行以下命令:

root@server: chown www-data /my/path/ -R

root@server: chgrp www-data /my/path/ -R

root@server: chmod 755 /my/path/ -R

root@server: libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path

convert /my/path/foo.ppt -> /my/path/foo.pdf

非常好用。


root@server: sudo -i -u www-data

$libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path

convert /my/path/foo.ppt -> /my/path/foo.pdf
Error: Please reverify input parameters...

该死。


root@server: sudo -i -u someotheruser

$libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path

convert /my/path/foo.ppt -> /my/path/foo.pdf
Error: Please reverify input parameters...

该死。

有人有什么想法吗?尝试研究这个问题只会让我更加困惑。这可能是一个错误还是某些依赖关系的怪异问题?


我在Ubuntu 12.04中也遇到了相同的问题,我正在尝试将ods文件转换为PDF,只有使用sudo才能正常工作。 - Jacek Wysocki
@Jacek Wysocki - 我找到了一个解决方法,使用LibreOffice的DocumentConverter.py(http://www.artofsolving.com/opensource/pyodconverter)。唯一的问题是,你需要将LibreOffice变成守护进程,这有点麻烦并且给我带来了一些麻烦。哦,还有,守护进程仍然需要以root身份运行。 - Greg
1
我也有一个:$ sudo visudo 然后我添加了这一行: %users ALL=(ALL) NOPASSWD: libreoffice 之后就可以使用sudo libreoffice ...而无需密码。 - Jacek Wysocki
9个回答

24

我终于找到了这个问题的答案...

添加:

export HOME=/tmp &&

回到开头,所以:

export HOME=/tmp && libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path

这在CentOS 6.5上对我有效,并且适用于PHP中的shell_exec()。


7
这真的应该成为被采纳的答案。你救了我的一天。 - Kapitein Witbaard
3
您也可以使用以下命令:HOME=/tmp libreoffice --headless --convert-to pdf:writer_pdf_Export /my/path/foo.ppt --outdir /my/path。这是因为您只针对一个进程设置了 HOME 变量。 - puzzlement
对我来说很有效,谢谢@greatmatter - Adeel Gill

5
当我们在NodeJS应用程序的CloudFoundry(Diego)容器中运行LibreOffice 5.0.5.2的soffice二进制文件时,遇到了同样的问题。似乎较新版本的libreoffice不需要一个可写的HOME,而是尝试写入TMPDIR。使用strace显示:8349 mkdir("app/tmp", 0777) = -1 ENOENT (No such file or directory)8349 open("app/tmp/lu8349pzgegi.tmp", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 ENOENT (No such file or directory),其中TMPDIR=app/tmp。我们通过将TMPDIR设置为应用程序进程用户可写的目录,即在CloudFoundry上设置TMPDIR=/tmp来解决这个问题:process.env.TMPDIR = "/tmp";

5
您需要做的全部就是创建文件夹"/var/www/.config"。当您尝试以www-data用户身份转换某些文件时,libreoffice需要在用户的主目录中使用".config"目录。但libreoffice没有权限创建这样的文件夹。用户www-data的默认主目录是"/var/www"。因此只需运行以下命令:
sudo mkdir /var/www/.config
sudo chmod 700 /var/www/.config
sudo chown www-data /var/www/.config

1
谢谢,我认为这是最好的解决方案。在Ubuntu 18.04和LibreOffice 6.3.1下,以www-data用户身份运行时对我有效。 - JasonBoss

2

此外,我还需要引用过滤器名称 soffice --headless --convert-to txt:"Text" ./*.docx(是的,这是针对Kubuntu 14.10上的LibreOffice安装,apt-file确认了libreoffice-common:/usr/bin/soffice)。 - pbhj

0

0

我通过先删除文件,然后运行转换文件的方式成功解决了这个问题。看起来由于文件所有者问题,文件覆盖失败了。


0

对我来说,这是由于输出文件夹不可写。使用--outdir并指定一个可写的文件夹。

如果输出文件已经存在,它将自动覆盖。

例如:

$ libreoffice --headless --convert-to pdf --outdir myfolder/ myfile.docx

-1
正如Jacek在评论中所述,将您要执行命令的用户设置为无需密码的sudoer。然后将您的libreoffice命令更改为:
sudo libreoffice <rest of command>

对我有用。我遇到了同样的问题。


-3

你不能使用www-data用户运行libreoffice soffice二进制文件。请改用具有sudo特权的用户。查看我的Gist https://gist.github.com/nathanielvarona/423bda9e4a8a4f0f9bbf#file-soffice-listener-sh

既然你要在PHP中使用它,那就尝试一下PHP-FPM。安装它,然后修改/etc/php5/fpm/pool.d/www.conf文件。

user = www-data 
group = www-data

To:

user = ubuntu
group = ubuntu

我已经成功地在AWS EC2和我的VBox虚拟机上运行了这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接