簡単な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分離」と呼ばれるものに関連しています。
true
をfalse
に変更:/etc/systemd/system/multi-user.target.wants/httpd.service
:
[Service]
PrivateTmp=false
...
私の問題を解決しますが、サービスファイルを変更せずにこれを回避することは可能ですか?.
Ubuntu 18.04を実行していますが、/ usr/lib/systemdにhttpまたはApache2のサービスが含まれていませんでした。ただし、次のコマンドを実行しました。
Sudo find / -mount -type f -exec grep -e "PrivateTmp" '{}' ';' -print
/ lib/systemd/Apache2.serviceにありますPrivateTmp = true。 trueをfalseに変更して実行する
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