web-dev-qa-db-ja.com

PHPスクリプトが/ tmpフォルダーにアクセスできない

私はopen_basedirを持っていません、phpは/ etc/usr/proc/homeなどにアクセスできますが、/ tmpにはアクセスできません。

tmpfsは/ tmpにマウントされています(/ tmp type tmpfs(rw))。これは、/ tmpフォルダーを使用する理由でもあります。

私のファイルはhttp(nginxとphpのユーザー)が所有し、誰でも読み取り可能です。

Sudo -u http cat /tmp/fileは機能していますが、phpスクリプト内のすべてが機能しません(file_exist()やfile()など)。

編集:ログにエラーが表示されます:

PHP Warning:  file(/tmp/ydlw/pid): failed to open stream: No such file or directory in /srv/http/ydlw/status.php on line 267

edit2:私は問題を別の方法でテストしました。私が作った

touch("/tmp/boo");
file_exist("/tmp/boo");

file_existはtrueを返すため、ファイルが作成されます。次に、/ tmpの内部を監視しましたが、「boo」ファイルが見つかりません。それは私が恐れていたものです、phpはマウントポイントを「参照」しません。それはなぜですか、どうすれば修正できますか?

18
eephyne

なぜ誰かが私にグローバルなヒントをくれたのかを見つけました。

これはphpやtmpfsのせいではありません。犯人はsystemdで、セキュリティシステムはPrivateTmpでした。

私が行ったのと同じ問題に遭遇した人のために、サービスphp(およびおそらく他のいくつか)には、systemdスクリプト(/usr/lib/systemd/system)のPrivateTmpに対するtrueオプションがあります。

その場合、新しい/tmpが作成され、他のものから分離されます。サービスが停止すると、内部に保存されているすべてのデータが削除されます。

/tmpには多くの機密情報が含まれる可能性があり、phpスクリプトは常に安全であるとは限らないため、これはセキュリティ対策です。

これを無効にするには、/etc/systemd/system内にスクリプトをコピーし(更新後に変更が上書きされないようにするため)、PrivateTmpfalseに設定します。

JoinsNamespaceOfを使用して、同じ/ tmpを共有するように2つ以上のサービスを設定することもできます。

詳細情報> man systemd.exec

32
eephyne