Convertir un fichier en PDF à l'aide de LibreOffice sous Apache utilisateur (c'est-à-dire lors de l'utilisation de PHP)

9

J'ai installé libreoffice-headless et je peux convertir des documents lorsque je suis connecté au shell en tant qu'utilisateur 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

Je souhaite maintenant faire la même chose, mais en utilisant PHP et donc en tant qu'utilisateur apache, cependant, ce qui suit ne convertira pas le fichier.

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

Dans une tentative de dépannage, j'ai exécuté la même commande via le shell en tant qu'utilisateur apache, mais il ne convertira toujours pas le fichier:

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

Apache contrairement aux utilisateurs normaux n'a pas de maison, et je me souviens avoir entendu que je devrais peut-être spécifier une maison à utiliser HOME=/tmp/aybavant d'essayer de convertir, mais cela n'aide pas (je pense qu'en utilisant CentOS 5.8 et probablement une version différente de LibreOffice, il mais je n'en suis pas certain).

Comment convertir un fichier au format PDF à l'aide de libreoffice lors de son exécution en tant qu'utilisateur apache?

Système installé:

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
user1032531
la source

Réponses:

14

Ici, nous avons deux problèmes. La première est que www-data(l'utilisateur apache) n'a pas de $HOMEbureau libre donc ne peut pas s'exécuter s'il n'y en a pas $HOMEdéfini. Le deuxième problème est, à moins que vous ne l'ayez spécifiquement configuré de cette façon (et vous ne devriez vraiment pas vraiment le faire), apachen'a pas accès au /tmprépertoire système . Un serveur Web s'exécute normalement dans un environnement restreint et n'a pas un accès complet au système de fichiers pour des raisons de sécurité très valables.

Donc, vous devez i) donner à l'utilisateur d'Apache une maison et ii) lui donner un répertoire auquel il a accès pour écrire. Donc, créez un tmprépertoire dans le même dossier où vous stockez votre page Web, puis exécutez le phpcode suivant :

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

Je viens de tester et cela fonctionne parfaitement sur ma machine. Assurez-vous que vos ./tmpautorisations sont définies sur 777. En outre, vous devrez peut-être redémarrer Apache si vous jouez trop avec. Il a cessé de fonctionner pour moi après un certain temps lorsque j'ai apporté des modifications et j'ai dû le redémarrer.

terdon
la source
Merci Terdon, ça marche aussi parfaitement pour moi. Quelques questions. Pourquoi ne pas les conserver dans / tmp, et pas dans le même dossier que celui où les pages Web sont stockées (je l'ai testé, cela fonctionne). Pourquoi ça ne export HOME=/tmp/ayb libreoffice --headless ...marche pas ? Quel est le but exportet pourquoi ne HOME=/tmp/ayb; libreoffice --headless....fonctionne pas ?
user1032531
Si vous pouvez réellement vous écrire, vous pouvez le /tmpfaire. Cependant, c'est une bonne idée, du point de vue de la sécurité, de ne pas donner à votre serveur Web accès aux répertoires extérieurs /var/www. exportexporte la variable, le rendant disponible à tous les coquilles suivantes et &&assure qu'il ne fonctionne que si l'exportation a réussi. Je ne suis pas sûr des détails, apache peut être assez pointilleux sur les autorisations, il est toujours préférable de tout garder sous votre wwwdossier.
terdon
Je suis mitigée sur l'utilisation de tmp. Oui, apache peut écrire à /tmp, et une bonne chose (je pense) à l' utiliser est qu'il purge automatiquement les anciens fichiers. Mais là encore, je vois votre point de tout garder sous /var/www.
user1032531
Également réel pour Ubuntu (sans que le répertoire personnel ne libreoffice --headlessmeure après le X11 connection rejected because of wrong authenticationmessage).
Stanislav Ivanov
3

J'ai eu un problème similaire sur Debian et je l'ai résolu.

Exécutez votre commande, mais avec straceau début, comme ceci:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Cela produira un énorme fichier journal avec chaque accès à l'API système et son résultat.
Dans mon cas, quelque part près de la ligne 5000, il y avait quelque chose comme ceci:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

En suivant cette piste, j'ai changé les autorisations récursivement pour le dossier /var/spool/libreofficeen 777.

Après cela, la conversion a commencé à fonctionner pour chaque utilisateur.

Peut-être que vous obtenez également Permission deniedun autre fichier, il est géré en silence et vous devez corriger les autorisations de votre utilisateur?

Paweł Gutowski
la source