簡単な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
問題を解決しました。
答え2
<pre><?php system("ls -la /tmp"); ?></pre>
..
常に表示: 。および..フォルダのみがブラウザに表示されます。 ..
なぜですか? ? ?
これがこの関数の完全なsystem()
目的です。単にシェルコマンドから出力の最後の行を返します。
それでは、無駄な出力を1行だけ提供するコマンドが存在するのはなぜですか?そうかもしれないシステム()シェルプロセスの終了コードをキャプチャできます($return_var
2番目の引数として渡す場合)。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