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

나는 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 또는 tmpfs의 결함이 아닙니다. 범인은 systemd와 그의 보안 시스템되었다 PrivateTmp.

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

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

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

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

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

자세한 내용은> man systemd.exec


답변