skrip php tidak dapat mengakses / folder tmp

16

Saya tidak punya open_basedir, php dapat mengakses / etc / usr / proc / home etc… tetapi tidak / tmp.

tmpfs adalah mount pada / tmp (/ tmp type tmpfs (rw)) Itu juga alasan saya ingin menggunakan folder / tmp.

File saya dimiliki oleh http (pengguna untuk nginx dan php) dan dapat dibaca oleh semua orang.

sudo -u http cat /tmp/file berfungsi tetapi apa pun di dalam skrip php tidak (seperti file_exist () atau file ()).

edit: kesalahan ditampilkan di log:

PHP Warning:  file(/tmp/ydlw/pid): failed to open stream: No such file or directory in /srv/http/ydlw/status.php on line 267

edit2: Saya menguji masalah ini dengan cara lain. saya membuat

touch("/tmp/boo");
file_exist("/tmp/boo");

dan file_exist mengembalikan true sehingga file dibuat. Lalu saya menonton di dalam / tmp dan tidak ada file "boo" dapat ditemukan di sana. Itu yang saya takutkan, php tidak «melihat» titik mount. Mengapa begitu dan bagaimana saya bisa memperbaikinya?

eephyne
sumber
Apa kesalahan yang dikembalikan oleh fungsi-fungsi PHP itu? Apa yang ditampilkan oleh log kesalahan PHP?
Tero Kilkanen
Saya menambahkan log kesalahan
eephyne
Apakah /tmp/ydlw/pidada file ini /tmp? Jika tidak, maka itu adalah alasan untuk pesan kesalahan.
Tero Kilkanen
-rw-r - r-- 1 http http 343 23 juil. 10:12 / tmp / ydlw / pid
eephyne
Apa distribusi Linux Anda dan versi PHP dan dari mana Anda mendapatkan PHP?
Michael Hampton

Jawaban:

31

Saya menemukan mengapa, seseorang memberi saya petunjuk global.

Itu bukan kesalahan php atau tmpfs. Pelakunya adalah systemd dan sistem keamanannya PrivateTmp.

Bagi mereka yang mendapatkan masalah yang sama dengan yang saya lakukan, layanan php (dan mungkin beberapa yang lain) memiliki PrivateTmpopsi untuk truedi skrip systemd ( /usr/lib/systemd/system).

Dalam hal itu, yang baru /tmpdibuat dan diisolasi dari yang lain. Semua data yang disimpan di dalam dihapus setelah layanan dihentikan.

Ini langkah pengamanan karena /tmpbisa mengandung banyak informasi sensitif dan skrip php tidak selalu aman.

Untuk menonaktifkan ini, cukup salin skrip di dalamnya /etc/systemd/system(untuk menghindari menimpa perubahan Anda setelah pembaruan) dan set PrivateTmpke false.

Anda juga dapat mengatur dua atau lebih layanan untuk menggunakan / tmp yang sama menggunakan JoinsNamespaceOf.

Untuk informasi lebih lanjut> man systemd.exec

eephyne
sumber
4
Terima kasih untuk itu! Saya menghabiskan sepanjang hari mencoba mencari tahu itu. Otak saya meleleh karena berusaha keras untuk mengetahuinya.
Marcelo