web-dev-qa-db-ja.com

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

このコマンドはすべて、ディレクトリファイル/サブディレクトリの完全なリストを返します。

これの理由は何ですか?

ls -lah /usrは問題なく動作するため、問題は「/ tmp」フォルダに関連しています。

私はこれを4つのコンプでテストしました(それらの1つはphp 5.0.6のdebianで、phpはすべてのファイルを期待どおりに表示し、他の3つのコンプはphp7を持ち、空の/ tmpを示します)。

更新:

httpをsudoersファイルに追加して「Sudo ls/tmp」を実行した後でも、問題はphpバージョン> 7で同じです。

しかし、「system( "echo aaa> /tmp/aaa.txt; ls -la/tmp")を実行すると、http:httpが所有する...、およびaaa.txtファイルが表示されます。これは、いくつかの新しいphpの制限であり、/ tmpファイルのみに干渉する可能性がある方法です。

pdate2:

しかし、aaa.txtは/ tmp内にありません。find /tmp -name aaa.txtを実行すると、/tmp/systemd-private-2cf1853410ad4ade980ec17e883771c3-httpd.service-lZ22gS/tmp/aaa.txt内にあることがわかります。

最後に、「systemd/tmp分離」と呼ばれるものに関連しています。

truefalseに変更:/etc/systemd/system/multi-user.target.wants/httpd.service

[Service]
PrivateTmp=false
...

私の問題を解決しますが、サービスファイルを変更せずにこれを回避することは可能ですか?.

5
Asain Kujovic

Ubuntu 18.04を実行していますが、/ usr/lib/systemdにhttpまたはApache2のサービスが含まれていませんでした。ただし、次のコマンドを実行しました。

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

/ lib/systemd/Apache2.serviceにありますPrivateTmp = truetruefalseに変更して実行する

systemctl daemon-restart
systemctl restart Apache2

問題を修正しました。

<pre><?php system("ls -la /tmp"); ?></pre>
..
常に次のように表示されます:。と..フォルダーだけで、ブラウザーには何もありません。 ..
これの理由は何ですか???

system()関数はすべて、そうするように設計されています。シェルコマンドからの出力の最後の行のみを返します。
では、なぜ1行の無駄な出力しか得られないコマンドが存在するのでしょうか。 system() を使用すると、シェルプロセスの終了コードをキャプチャできます(2番目の引数として_$return_var_を渡した場合)。一方、_Shell_exec_-これにより、すべてのシェル出力、は終了コードを与えません!

したがって、すべての出力と終了コードが必要な場合はexec()を使用できますが、完全な出力は参照配列_$output_を介してのみ利用できるため、execは面倒です次に、出力を確認するためにループする必要があります。

また、_/tmp_で遊んでいるので、php-fpmデーモンを管理するためにsystemdを使用する新しいバージョンのPHP-FPMが、phpファイルの実行をブロックする設定を渡すことに注意してください。 tmpが不足しています。
ラップトップでphp 7.0.1を実行していますが、_7.1.1_をインストールしたところ、この小さなディレクティブが埋め込まれていることがわかりました

_PrivateTmp=true
_

systemdサービスファイル内。 _/tmp_からPHPスクリプトを実行する場合は、falseに設定する必要があります
その特定の問題の背景について
https://serverfault.com/questions/614781/php-script-cant-access-tmp-folder

1
the_velour_fog