簡単な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つのコンポーネントでテストしました(そのうちの1つはphp 5.0.6を使用しているdebianです。 )。
修正する:
sudoersファイルにhttpを追加して「sudo ls / tmp」を実行しても、PHPバージョン> 7では問題は同じままです。
ただし、 'system("echo aaa > /tmp/aaa.txt; ls -la /tmp") を実行すると.
、..
およびaaa.txt
http: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
問題を解決しました。