PHPでファイルを読み取ろうとしていますが、誰もがファイルへの読み取りアクセス権を持っていますが、アクセス許可が拒否されましたというエラーが表示されます。
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
)に従うように構成されています。 /var/lib/jenkins/
にDirectory
ディレクティブを追加しても違いはありません。
<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/bar
は0777
パーミッション、ディレクトリに実行パーミッションがない場合、その内容の読み取りは拒否されます。
ターゲットディレクトリとシンボリックリンクの両方に設定する権限が必要です。
そのファイルまでの階層内のすべてのディレクトリに実行ビットを設定する必要があります。
chmod o+x /var/lib/jenkins
トリックを行う必要があります。
(注:ls -lhd /var/lib/jenkins
はls -lh ...|grep jenkins
よりも少し優れています)
多くの最新のボックス(Digital Ocean、rackspaceなど)には、RedHat互換OS(CentOSなど)用のSELinux(Security Enhanced Linux)が付属しています。これはあなたが心に留めておく必要がある作品に別のレンチを投げます。権限を設定することができます完全に設定しても、権限が拒否されたと表示されます。 SELinuxの書き込み可能なコンテキストを定義する必要があります。
Sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite -R
ほとんどの場合、ApacheユーザーはWebファイルの読み取りまたはアクセスを許可されていません
Apacheが実行されているユーザーを確認します。
$ ps aux | grep [a]pache root 40283 0.0 0.2 472548 21116 ? Ss 14:38 0:00 /usr/sbin/Apache2 -k start www-data 40287 0.0 0.1 472760 8800 ? S 14:38 0:00 /usr/sbin/Apache2 -k start www-data 40288 0.0 0.1 472760 8540 ? S 14:38 0:00 /usr/sbin/Apache2 -k start www-data 40289 0.0 0.1 472776 8540 ? S 14:38 0:00 /usr/sbin/Apache2 -k start
Webファイルのパス所有権を確認してください。
$ namei -mol /home/john/app2/ f: /home/john/app2/ drwxr-xr-x root root / drwxr-xr-x root root home drwx------ john john john # <== Ahaa, no access for Apache user! drwxr-xr-x john john john app2
それに応じて権限を調整します。
このステップでは、それをあなたに任せます、あなたは(a)この例ではmakeApacheユーザー 'john'。または、(b)Webフォルダを外部の場所に移動することもできます家。セキュリティのグッドプラクティスを破ることなく、グループまたは他のユーザーに実行アクセスを許可できる場合。
a。 Apacheユーザーをjohnにします(開発サイトの場合、または自分が何をしているかを知っている場合のみ)
Sudo vi /etc/Apache2/envars
# replace
export Apache_RUN_USER=www-data
export Apache_RUN_GROUP=www-data
# with
export Apache_RUN_USER=john
export Apache_RUN_GROUP=john
b。そのフォルダを家の外に移動します...とにかくそこで何をしているのですか?
Sudo mv /home/john/app2 /var/www/
このディレクトリに一致するようにサイトを変更し、Apacheサーバーを再起動することを忘れないでください。
ここにいくつかの参照があります: