PHP가 /tmp 파일을 볼 수 없는 이유는 무엇입니까?

PHP가 /tmp 파일을 볼 수 없는 이유는 무엇입니까?

간단한 test.php 페이지가 있습니다.

<pre><?php system("ls -la /tmp"); ?></pre>

항상 : ...폴더만 표시되며 브라우저에는 다른 내용이 표시되지 않습니다.

명령줄에서:

1) ls -la /tmp
2) sudo -u http ls -la /tmp
3) php test.php
4) sudo -u http php test.php

이러한 모든 명령은 디렉터리 파일/하위 디렉터리의 전체 목록을 반환합니다.

이유는 무엇입니까? ? ?

문제는 "/tmp" 폴더와 관련되어 있으며 정상적으로 ls -lah /usr작동합니다.

나는 이것을 4개의 구성 요소에서 테스트했습니다(그 중 하나는 php 5.0.6을 사용하는 debian이고 php는 예상한 대로 모든 파일을 잘 표시하고, 다른 3개 구성 요소는 php7을 가지며 빈 /tmp를 표시합니다).

고쳐 쓰다:

sudoers 파일에 http를 추가하고 "sudo ls /tmp"를 실행한 후에도 PHP 버전 > 7에서는 문제가 동일하게 유지됩니다.

그러나 'system("echo aaa > /tmp/aaa.txt; ls -la /tmp")을 실행하면 ., ..aaa.txthttp:http가 소유한 파일이 표시됩니다. 이것이 새로운 PHP 제한사항이며 /tmp 파일에만 간섭하는 방식입니까?

업데이트 2:

하지만 aaa.txt는 /tmp에 없고 를 실행해 보니 find /tmp -name aaa.txt거기에 있는 것을 알 수 있습니다 /tmp/systemd-private-2cf1853410ad4ade980ec17e883771c3-httpd.service-lZ22gS/tmp/aaa.txt.

그래서 결국에는 "시스템화 /tmp 격리"…나는 배움이 필요해.

내부 true로 변경 : :false/etc/systemd/system/multi-user.target.wants/httpd.service

[Service]
PrivateTmp=false
...

내 문제를 해결했지만 서비스 파일을 변경하지 않고도 이 문제를 피할 수 있는지 궁금합니다.

답변1

Ubuntu 18.04를 실행 중이고 /usr/lib/systemd에 http 또는 apache2 서비스가 포함되어 있지 않습니다. 그러나 다음 명령을 실행했습니다.

sudo find / -mount -type f -exec grep -e "PrivateTmp" '{}' ';' -print

그리고 발견된/lib/systemd/apache2.service이것PrivateTmp=true. 변화진짜도착하다잘못된그리고 실행

systemctl daemon-restart
systemctl restart apache2

문제를 해결했습니다.

답변2

<pre><?php system("ls -la /tmp"); ?></pre>
..
항상 표시: . 및 .. 폴더만 브라우저에 표시됩니다. ..
이유는 무엇입니까? ? ?

이것이 이 함수의 전체 system()목적 입니다. 단지 쉘 명령에서 출력의 마지막 줄을 반환합니다.
그렇다면 쓸모없는 출력 한 줄만 제공하는 명령이 존재하는 이유는 무엇입니까? 그럴 수도 있지체계()쉘 프로세스의 종료 코드를 캡처할 수 있습니다( $return_var두 번째 인수로 전달하는 경우). shell_exec- 모든 쉘 출력을 제공합니다. 종료 코드가 제공되지 않습니다!

따라서 모든 출력 및 종료 코드를 원하는 경우 를 사용할 수 있지만 exec()전체 출력은 배열을 참조해야만 사용할 수 있고 출력을 보려면 루프를 반복해야 하기 exec때문에 번거롭습니다 .$output

또한, 놀고 있는 동안 php-fpm 데몬을 관리하기 위한 최신 버전의 PHP-FPM은 tmp를 소모하지 않도록 php 파일의 실행을 차단하는 설정을 전달한다는 것을 /tmp알아야 합니다 . 나는 내 노트북에서 PHP 7.0.1을 실행하고 있었는데, 그것을 설치 하고 이제 이 작은 지시문이 내장되어 있다는 것을 발견했습니다.systemd
7.1.1

PrivateTmp=true

systemd 서비스 파일에 있습니다. 이 특정 문제에 대한 더 많은 배경 정보를 얻기 위해 PHP 스크립트를 실행하려면 /tmp
이를 false로 설정해야 합니다.
https://serverfault.com/questions/614781/php-script-cant-access-tmp-folder

관련 정보