Convierta el archivo a PDF usando LibreOffice bajo el usuario apache (es decir, cuando usa PHP)

9

Instalé libreoffice-headless y puedo convertir documentos cuando inicie sesión en el shell como usuario normal.

[root@desktop ~]# yum install libreoffice-headless
[root@desktop ~]# yum install libreoffice-writer
[root@desktop ~]# su NotionCommotion
sh-4.1$ /usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc
convert /tmp/ayb/document_34.doc -> /tmp/ayb/document_34.pdf using writer_pdf_Export

Ahora deseo hacer lo mismo, pero usando PHP y, por lo tanto, como usuario apache, sin embargo, lo siguiente no convertirá el archivo.

<?php
  shell_exec('/usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc');
?>

En un intento de solucionar problemas, ejecuté el mismo comando a través del shell que el usuario apache, pero aún así no convertirá el archivo:

[root@desktop ~]# su -s /bin/sh apache -c "/usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc"

Apache, a diferencia de los usuarios normales, no tiene un hogar, y recuerdo haber escuchado que podría necesitar especificar un hogar usando HOME=/tmp/aybantes de intentar convertir, pero no ayuda (creo que cuando uso CentOS 5.8 y probablemente una versión diferente de LibreOffice, lo hice, pero no estoy seguro).

¿Cómo convierto un archivo a PDF usando libreoffice cuando lo ejecuto como usuario apache?

Sistema instalado

CentOS 6.4
httpd.x86_64                    2.2.15-28.el6.centos              @updates
libreoffice-headless.x86_64     1:3.4.5.2-16.1.el6_3              @base
usuario1032531
fuente

Respuestas:

14

Hay dos problemas aquí. La primera es que www-data(el usuario de apache) no tiene una $HOMEoficina libre, por lo que no se puede ejecutar si no hay una $HOMEdefinida. El segundo problema es, a menos que lo configure específicamente de esta manera (y realmente realmente no debería), apacheno tiene acceso al /tmpdirectorio del sistema . Un servidor web normalmente se ejecuta en un entorno restringido y no tiene acceso completo al sistema de archivos por razones de seguridad muy válidas.

Por lo tanto, debe i) dar un inicio al usuario de apache y ii) darle un directorio al que tenga acceso para escribir. Por lo tanto, cree un tmpdirectorio en la misma carpeta donde almacena su página web y luego ejecute el siguiente phpcódigo:

<?php
  shell_exec('export HOME=/tmp && libreoffice --headless -convert-to pdf --outdir ./tmp /tmp/ayb/document_34.doc');
?>

Acabo de probar y funciona perfectamente en mi máquina. Asegúrese de que ./tmptiene sus permisos establecidos en 777. Además, es posible que deba reiniciar apache si juega demasiado con él. Dejó de funcionar para mí después de un tiempo cuando hice cambios y necesitaba reiniciarlo.

terdon
fuente
Gracias terdon, funciona perfecto para mí también. Par de preguntas. ¿Por qué no mantenerlos en / tmp, y no en la misma carpeta donde están almacenadas las páginas web (lo probé, funciona). ¿Por qué no export HOME=/tmp/ayb libreoffice --headless ...funciona? ¿Para exportqué sirve y por qué no HOME=/tmp/ayb; libreoffice --headless....funciona?
user1032531
Si realmente puede escribirle, /tmppuede hacerlo. Sin embargo, desde el punto de vista de la seguridad, es una buena idea no permitir que su servidor web acceda a directorios externos /var/www. exportexporta la variable, dejándola disponible para todos los shells posteriores y &&se asegura de que se ejecute solo si la exportación se realizó correctamente. No estoy seguro de los detalles, apache puede ser bastante quisquilloso con los permisos, siempre es mejor mantener todo bajo su wwwcarpeta.
terdon
Estoy mezclado con el uso de tmp. Sí, Apache puede escribir /tmp, y una buena cosa (creo) acerca de su uso es que purga automáticamente los archivos antiguos. Pero, de nuevo, veo su punto sobre mantener todo bajo /var/www.
user1032531
También actual para Ubuntu (sin el directorio de inicio libreoffice --headlessmuere después del X11 connection rejected because of wrong authenticationmensaje).
Stanislav Ivanov
3

Tuve un problema similar en Debian y lo resolví.

Ejecute su comando, pero con straceal principio, así:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Esto producirá un archivo de registro enorme con cada acceso a la API del sistema y su resultado.
En mi caso, en algún lugar cerca de la línea 5000 había algo como esto:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Siguiendo este camino, he cambiado los permisos de forma recursiva para la carpeta /var/spool/libreofficea 777.

Después de eso, la conversión comenzó a funcionar para todos los usuarios.

¿Quizás también obtenga Permission deniedalgún otro archivo, se maneja en silencio y necesita corregir los permisos para su usuario?

Paweł Gutowski
fuente