1. ホーム
  2. php

[解決済み] PHPで適切なパーミッションが与えられているにもかかわらず、パーミッションが拒否される

2022-02-15 13:10:54

質問

PHPでファイルを読み込もうとしているのですが、誰もがそのファイルに読み取りアクセスできるにもかかわらず、permission deniedエラーが発生します。

PHPのコードです。

$config=file_get_contents('/opt/jenkins/home/config.xml');

エラーです。

Warning: file_get_contents(/opt/jenkins/home/config.xml): failed to open stream: Permission denied in [...]

ファイルシステムのパーミッションです。

を指すシンボリックリンクがあります。 /opt/jenkins/home/ から /var/lib/jenkins で、全員がシンボリックリンク、実際のフォルダ、およびファイルに対する読み取り権限を持っています。

$ ls -lh /opt/jenkins/
lrwxrwxrwx 1 sysadmin sysadmin   16 2011-08-04 08:12 home -> /var/lib/jenkins

$ ls -lh /var/lib/ | grep jenkins
drwxr-xr-- 6 jenkins adm     4.0K 2011-08-04 10:04 jenkins

$ ls -lh /var/lib/jenkins/config.xml
-rwxr-xr-- 1 jenkins adm 3.9K 2011-08-04 10:05 /var/lib/jenkins/config.xml

Apacheの設定

シンボリックリンクに従うように設定されている ( Options All ). を追加することで Directory ディレクティブを /var/lib/jenkins/ を使っても違いはありません。

<Directory /opt/jenkins/home/>
        Options All
        AllowOverride All
        Order Allow,Deny
        Allow from All
</Directory>

追加情報

シンボリックリンクによるパスを使用するかどうか ( "/opt/jenkins/home/config.xml" ) か、実際のパス ( "/var/lib/jenkins/config.xml" ) 同じ問題が発生します。

apache2 version=2.2.14-5ubuntu8.4
php version=5.3.2-1ubuntu4.9

なぜこのようなエラーが発生するのか、何か心当たりはありますか?

解決方法を教えてください。

あなたのディレクトリには execute のパーミッションが必要です。ワールドエグゼクティブはないようです。 jenkins はおそらくapacheユーザではなく、apacheユーザが adm グループに所属している場合は、うまくいかないでしょう。

$ ls -lh /var/lib/ | grep jenkins
drwxr-xr-- 6 jenkins adm     4.0K 2011-08-04 10:04 jenkins

例によって。

netcoder@netcoder:~$ mkdir foo
netcoder@netcoder:~$ echo hello > foo/bar
netcoder@netcoder:~$ chmod 777 foo/bar
netcoder@netcoder:~$ ls -lsah foo/bar 
4.0K -rwxrwxrwx 1 netcoder netcoder 6 2011-08-04 08:22 foo/bar
netcoder@netcoder:~$ chmod 444 foo/
netcoder@netcoder:~$ ls -lsah | grep foo
4.0K dr--r--r--  2 netcoder netcoder 4.0K 2011-08-04 08:22 foo
netcoder@netcoder:~$ cat foo/bar 
cat: foo/bar: Permission denied

にもかかわらず foo/bar0777 実行権限がない場合、そのディレクトリの内容の読み取りは拒否されます。

ターゲットディレクトリとシンボリックリンクの両方にパーミッションが設定されている必要があります。