PHP 스크립트는 / tmp 폴더에 액세스 할 수 없습니다


16

나는 open_basedir이 없으며, PHP는 / etc / usr / proc / home 등에 액세스 할 수 있지만 / tmp는 액세스 할 수 없습니다.

tmpfs는 / tmp에 마운트됩니다 (/ tmp type tmpfs (rw)) 또한 / tmp 폴더를 사용하려는 이유이기도합니다.

내 파일은 http (nginx 및 php 사용자)가 소유하고 모든 사람이 읽을 수 있습니다.

sudo -u http cat /tmp/file 작동하지만 PHP 스크립트 내부의 파일은 없습니다 (file_exist () 또는 file ()).

편집 : 로그에 오류 표시 :

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 : 다른 방법으로 문제를 테스트했습니다. 내가 만든

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

file_exist는 true를 반환하므로 파일이 생성됩니다. 그런 다음 / tmp 내부를보고 "boo"파일을 찾을 수 없습니다. 그것이 내가 두려워했던 것입니다. php는 마운트 지점을«see»하지 않습니다. 그 이유는 무엇이며 어떻게 해결할 수 있습니까?


해당 PHP 함수에서 반환되는 오류는 무엇입니까? PHP 에러 로그는 무엇을 보여줍니까?
Tero Kilkanen

오류 로그를 추가했습니다
eephyne

이 파일 /tmp/ydlw/pid이에 /tmp있습니까? 그렇지 않은 경우, 이것이 오류 메시지의 이유입니다.
Tero Kilkanen

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

Linux 배포판과 PHP 버전은 무엇이며 어디서 PHP를 얻었습니까?
마이클 햄튼

답변:


31

누군가 왜 나에게 세계적인 힌트를 주 었는지 알았습니다.

php 또는 tmpfs의 결함이 아닙니다. 범인은 systemd와 그의 보안 시스템되었다 PrivateTmp.

내가했던 것과 같은 문제에 처한 사람들을 위해 서비스 PHP (및 아마도 다른 사람들)는 시스템 스크립트 ( ) 에서 PrivateTmp옵션을 사용할 수 있습니다.true/usr/lib/systemd/system

이 경우 새로운 /tmp것이 만들어지고 다른 것과 분리됩니다. 서비스가 중지되면 내부에 저장된 모든 데이터가 삭제됩니다.

/tmp중요한 정보를 많이 포함 할 수 있고 PHP 스크립트가 항상 안전한 것은 아니기 때문에 보안 조치 입니다.

이 기능을 비활성화하려면 /etc/systemd/system업데이트 후 변경 사항을 덮어 쓰지 않도록 스크립트를 내부에 복사 하고로 설정 PrivateTmp하십시오 false.

을 사용하여 동일한 / tmp를 공유하도록 둘 이상의 서비스를 설정할 수도 있습니다 JoinsNamespaceOf.

자세한 내용은> man systemd.exec


4
감사합니다! 나는 하루 종일 그것을 알아 내려고 노력했다. 내 두뇌가 코를 녹여서 알아 내기 위해 열심히 노력하고 있습니다.
Marcelo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.