Tập lệnh php không thể truy cập thư mục / tmp


16

Tôi không có open_basingir, php có thể truy cập / etc / usr / Proc / home v.v ... nhưng không / tmp.

tmpfs được mount trên / tmp (/ tmp type tmpfs (rw)) Đó cũng là lý do tôi muốn sử dụng thư mục / tmp.

Các tệp của tôi được sở hữu bởi http (người dùng cho nginx và php) và mọi người đều có thể đọc được.

sudo -u http cat /tmp/file đang hoạt động nhưng mọi thứ bên trong tập lệnh php không (như file_exist () hoặc file ()).

chỉnh sửa: lỗi hiển thị trong nhật ký:

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: Tôi đã thử nghiệm vấn đề theo cách khác. tôi đã làm

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

và file_exist trả về true để tệp được tạo. Sau đó, tôi đã xem bên trong / tmp và không có tập tin "boo" nào có thể được tìm thấy ở đó. Đó là điều tôi sợ, php không «thấy» điểm gắn kết. Tại sao lại như vậy và làm thế nào tôi có thể sửa nó?


Lỗi được trả về bởi các hàm PHP đó là gì? Nhật ký lỗi PHP hiển thị gì?
Tero Kilkanen

Tôi đã thêm nhật ký lỗi
eephyne

Liệu tập tin này /tmp/ydlw/pidtồn tại trong /tmp? Nếu không, đó là lý do cho thông báo lỗi.
Tero Kilkanen

-rw-r - r-- 1 http http 343 23 juil. 10:12 / tmp / ydlw / pid
eephyne

Bản phân phối Linux và phiên bản PHP của bạn là gì và bạn đã lấy PHP từ đâu?
Michael Hampton

Câu trả lời:


31

Tôi phát hiện ra tại sao, tốt, ai đó đã cho tôi gợi ý toàn cầu.

Đó không phải là lỗi của php hay tmpfs. Thủ phạm là systemd và hệ thống an ninh của anh ta PrivateTmp.

Đối với những người gặp vấn đề tương tự như tôi đã làm, dịch vụ php (và có thể một số người khác) có PrivateTmptùy chọn truetrong tập lệnh systemd ( /usr/lib/systemd/system).

Trong trường hợp đó, một cái mới /tmpđược tạo ra và tách biệt với cái khác. Tất cả các dữ liệu lưu bên trong sẽ bị xóa sau khi dịch vụ bị dừng.

Đây là một biện pháp bảo mật vì /tmpcó thể chứa rất nhiều thông tin nhạy cảm và tập lệnh php không phải lúc nào cũng an toàn.

Để hủy kích hoạt tính năng này, chỉ cần sao chép tập lệnh bên trong /etc/systemd/system(để tránh ghi đè các thay đổi của bạn sau khi cập nhật) và đặt PrivateTmpthành false.

Bạn cũng có thể đặt hai hoặc nhiều dịch vụ để chia sẻ cùng / tmp bằng cách sử dụng JoinsNamespaceOf.

Để biết thêm thông tin> man systemd.exec


4
Cảm ơn vì điều đó! Tôi đã dành cả ngày để cố gắng để tìm ra điều đó. Não tôi đang chảy ra từ mũi vì đã cố gắng hết sức để tìm ra điều đó.
Marcelo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.