Konversi file ke PDF menggunakan LibreOffice di bawah apache pengguna (yaitu ketika menggunakan PHP)

9

Saya menginstal libreoffice-headless dan dapat mengkonversi dokumen ketika masuk ke shell sebagai pengguna 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

Saya sekarang ingin melakukan hal yang sama, tetapi menggunakan PHP dan karenanya sebagai apache pengguna, bagaimanapun, berikut ini tidak akan mengkonversi file.

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

Dalam upaya memecahkan masalah, saya menjalankan perintah yang sama melalui shell sebagai apache pengguna, tetapi tetap saja tidak akan mengonversi 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 tidak seperti pengguna normal yang tidak memiliki rumah, dan saya ingat pernah mendengar saya mungkin perlu menentukan rumah menggunakan HOME=/tmp/aybsebelum mencoba untuk mengkonversi, tetapi itu tidak membantu (saya pikir ketika menggunakan CentOS 5.8 dan mungkin versi LibreOffice yang berbeda, itu lakukan, tetapi saya tidak yakin).

Bagaimana cara mengonversi file ke PDF menggunakan libreoffice saat menjalankannya sebagai apache pengguna?

Sistem yang diinstal:

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
pengguna1032531
sumber

Jawaban:

14

ada dua masalah disini. Yang pertama adalah bahwa www-data(pengguna apache) tidak memiliki $HOMEsehingga libreoffice tidak dapat berjalan jika tidak ada yang $HOMEdidefinisikan. Masalah kedua adalah, kecuali Anda secara khusus mengaturnya dengan cara ini (dan Anda benar-benar benar-benar tidak seharusnya), apachetidak memiliki akses ke /tmpdirektori sistem . Server web biasanya berjalan dalam lingkungan terbatas dan tidak memiliki akses penuh ke sistem file untuk alasan keamanan yang sangat valid.

Jadi, Anda perlu i) memberikan pengguna apache rumah dan ii) memberikannya direktori yang memiliki akses untuk menulis. Jadi, buat tmpdirektori di folder yang sama di mana Anda menyimpan halaman web Anda dan kemudian jalankan phpkode berikut :

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

Saya baru saja menguji dan berfungsi dengan baik pada mesin saya. Pastikan ./tmpizin Anda telah disetel ke 777. Selain itu, Anda mungkin harus memulai ulang apache jika terlalu sering memainkannya. Itu berhenti bekerja untuk saya setelah beberapa saat ketika saya membuat perubahan dan saya perlu me-restart itu.

terdon
sumber
Terima kasih terdon, bekerja sempurna untuk saya juga. Beberapa pertanyaan. Mengapa tidak menyimpannya di / tmp, dan tidak di folder yang sama dengan tempat halaman web disimpan (saya mengujinya, itu berfungsi). Kenapa tidak export HOME=/tmp/ayb libreoffice --headless ...berhasil? Apa tujuan exportdan mengapa tidak HOME=/tmp/ayb; libreoffice --headless....berhasil?
user1032531
Jika Anda benar-benar dapat menulis kepada /tmpAnda, Anda bebas untuk melakukannya. Namun, itu adalah ide yang baik dari sudut pandang keamanan untuk tidak memberikan akses server web Anda ke direktori yang ada di luar /var/www. exportmengekspor variabel, membuatnya tersedia untuk semua shell berikutnya dan &&memastikan itu berjalan hanya jika ekspor berhasil. Saya tidak yakin tentang perinciannya, apache bisa sangat rewel tentang izin, selalu lebih baik menyimpan semuanya di wwwfolder Anda .
terdon
Saya bingung menggunakan tmp. Ya, apache dapat menulis /tmp, dan hal yang baik (saya pikir) tentang menggunakannya adalah secara otomatis membersihkan file lama. Tapi sekali lagi, saya mengerti maksud Anda tentang menjaga segala sesuatu di bawah /var/www.
user1032531
Juga aktual untuk Ubuntu (tanpa direktori home libreoffice --headlessmati setelah X11 connection rejected because of wrong authenticationpesan).
Stanislav Ivanov
3

Saya memiliki masalah serupa pada Debian dan saya menyelesaikannya.

Jalankan perintah Anda, tetapi dengan stracedi awal, seperti ini:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Ini akan menghasilkan file log besar dengan setiap akses ke sistem API dan hasilnya.
Dalam kasus saya, di suatu tempat dekat garis 5000 ada sesuatu seperti ini:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Mengikuti jejak ini, saya mengubah hak akses secara rekursif untuk folder /var/spool/libreofficeuntuk 777.

Setelah itu, konversi mulai berfungsi untuk setiap pengguna.

Mungkin Anda juga mendapatkan Permission deniedbeberapa file lain, ditangani diam-diam, dan Anda perlu memperbaiki izin untuk pengguna Anda?

Paweł Gutowski
sumber