Converti file in PDF usando LibreOffice sotto l'utente apache (cioè quando usi PHP)


9

Ho installato libreoffice-headless e posso convertire documenti quando si accede alla shell come un normale utente.

[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

Vorrei ora fare la stessa cosa, ma usando PHP e quindi come utente apache, tuttavia, il seguente non convertirà il file.

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

Nel tentativo di risolvere i problemi, ho eseguito lo stesso comando tramite la shell dell'utente apache, ma non convertirà il file:

[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 differenza degli utenti normali non ha una casa, e ricordo di aver sentito che potrei aver bisogno di specificare una casa usando HOME=/tmp/aybprima di provare a convertire, ma non aiuta (penso che quando uso CentOS 5.8 e probabilmente una versione diversa di LibreOffice, sì, ma non ne sono certo).

Come posso convertire un file in PDF usando libreoffice quando lo eseguo come apache utente?

Sistema installato:

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

Risposte:


14

Ci sono due problemi qui. Il primo è che www-data(l'utente apache) non ha un $HOMElibreoffice che non può essere eseguito se non è $HOMEdefinito. Il secondo problema è che, a meno che non sia stato impostato in questo modo (e davvero non si dovrebbe davvero), apachenon si ha accesso alla /tmpdirectory di sistema . Un server Web funziona normalmente in un ambiente limitato e non ha pieno accesso al file system per motivi di sicurezza molto validi.

Quindi, devi i) dare all'utente home di apache e ii) dargli una directory a cui abbia accesso per scrivere. Quindi, crea una tmpdirectory nella stessa cartella in cui memorizzi la tua pagina web ed esegui il seguente phpcodice:

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

Ho appena testato e funziona perfettamente sulla mia macchina. Assicurati di ./tmpavere le autorizzazioni impostate su 777. Inoltre, potresti aver bisogno di riavviare apache se giochi troppo con esso. Ha smesso di funzionare per me dopo un po 'quando ho apportato modifiche e ho dovuto riavviarlo.


Grazie terdon, funziona perfettamente anche per me. Un paio di domande. Perché non tenerli in / tmp e non nella stessa cartella in cui sono archiviate le pagine Web (l'ho provato, funziona). Perché non export HOME=/tmp/ayb libreoffice --headless ...funziona? Qual è lo scopo exporte perché non HOME=/tmp/ayb; libreoffice --headless....funziona?
user1032531

Se riesci effettivamente a scriverti, /tmpsei libero di farlo. Tuttavia, è una buona idea da un punto di vista della sicurezza non dare al tuo server web l'accesso alle directory esterne /var/www. exportesporta la variabile, rendendola disponibile a tutte le shell successive e si &&assicura che venga eseguita solo se l'esportazione ha avuto esito positivo. Non sono sicuro dei dettagli, Apache può essere abbastanza schizzinoso riguardo alle autorizzazioni, è sempre meglio tenere tutto sotto la tua wwwcartella.
terdon

Sono confuso nell'usare tmp. Sì, Apache può scrivere su /tmp, e una buona cosa (penso) sull'uso è che cancella automaticamente i vecchi file. Ma poi di nuovo, vedo il tuo punto su come tenere tutto sotto controllo /var/www.
user1032531

Esatto anche per Ubuntu (senza home directory libreoffice --headlessmuore dopo il X11 connection rejected because of wrong authenticationmessaggio).
Stanislav Ivanov,

3

Ho avuto un problema simile su Debian e l'ho risolto.

Esegui il tuo comando, ma con straceall'inizio, in questo modo:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Questo produrrà un enorme file di registro con ogni accesso all'API di sistema e al suo risultato.
Nel mio caso, da qualche parte vicino alla linea 5000 c'era qualcosa del genere:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Seguendo questa traccia, ho modificato le autorizzazioni in modo ricorsivo per la cartella /var/spool/libreofficein 777.

Successivamente, la conversione ha iniziato a funzionare per tutti gli utenti.

Forse ottieni anche Permission deniedqualche altro file, viene gestito in modo silenzioso e devi correggere le autorizzazioni per il tuo utente?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.