2011-08-04 19 views
12

Tôi đang cố đọc một tệp bằng PHP và tôi nhận được sự cho phép bị từ chối lỗi mặc dù mọi người đều có quyền truy cập đọc tệp.Quyền bị từ chối bất chấp các điều khoản thích hợp khi sử dụng PHP

Mã PHP:

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

Lỗi:

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

Việc cho phép hệ thống tập tin:

Có một liên kết tượng trưng chỉ /opt/jenkins/home/ để /var/lib/jenkins và mỗi cơ thể đã đọc quyền trên liên kết tượng trưng, ​​thư mục thực tế và tệp.

$ 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 cấu hình

Cấu hình để folllow symlink (Options All). Thêm một chỉ thị Directory cho /var/lib/jenkins/ không có sự khác biệt.

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

thông tin bổ sung

Cho dù tôi sử dụng đường dẫn thông qua các liên kết tượng trưng ("/opt/jenkins/home/config.xml") hoặc con đường thực ("/var/lib/jenkins/config.xml") Tôi có cùng một vấn đề.

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

Bất kỳ ý tưởng nào về lý do tôi gặp lỗi?

+1

[ 'is_writable()'] (http://php.net/manual/en/function.is-writable.php) trả về 'FALSE'? – alex

+0

là apache được cấu hình để theo dõi các liên kết không? afaik có một tùy chọn SymLink – knittl

+0

cảm ơn cho các ý kiến ​​nhưng xin vui lòng đọc câu hỏi cẩn thận hơn (Tôi muốn đọc các tập tin, và có, apache sau được cấu hình để làm theo các liên kết). – Max

Trả lời

11

Yêu cầu thư mục của bạn execute cho phép tính năng này hoạt động. Nó dường như không có thế giới thực hiện, và vì jenkins có lẽ không phải người sử dụng apache, và người sử dụng apache không nằm trong nhóm adm, nó sẽ không làm việc:

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

mỗi ví dụ:

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

Mặc dù foo/bar có quyền 0777, nếu thư mục không có quyền thực thi, việc đọc nội dung của nó bị từ chối.

Bạn cần có quyền được đặt cho cả thư mục đích và liên kết tượng trưng.

+0

Vì vậy, anh ta cần phải thiết lập quyền thực thi trên dir thực, hoặc trên symlink? –

+0

@Clement Herreman: Cả hai. Câu trả lời đã chỉnh sửa. :) – netcoder

+0

Nó ** phải ** được đặt trên cả hai, hoặc trên cái mà anh ta sử dụng trong 'file_get_contents()' của mình? –

7

Bạn cần đặt bit thực thi trên tất cả các thư mục trong phân cấp lên đến tệp đó.

chmod o+x /var/lib/jenkins 

nên thực hiện thủ thuật.

(Lưu ý: ls -lhd /var/lib/jenkins là một chút tốt hơn so với ls -lh ...|grep jenkins)

+0

Đúng. 1 cho ls -d. – Max

0

Nhiều khả năng sử dụng apache của bạn không được phép đọc hoặc truy cập vào các tập tin web

  1. Kiểm tra những gì người sử dụng là apache chạy như:

    $ 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 
    
  2. Kiểm tra đường dẫn quyền sở hữu tệp web của bạn:

    $ 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 
    
  3. Điều chỉnh điều khoản cho phù hợp:

Vâng trong bước này, tôi sẽ để nó tùy thuộc vào bạn, bạn có thể (a)sự làm cho người sử dụng apache 'john' trong ví dụ này. Hoặc bạn có thể (b)di chuyển thư mục web đến một địa điểm bên ngoài nhà riêng. Trường hợp truy cập thực thi có thể được trao cho nhóm hoặc thậm chí cả những người khác mà không phá vỡ các thực hành tốt về bảo mật.

a. Làm cho người dùng apache john (CHỈ DÀNH CHO DEV SITES hoặc nếu bạn biết mình đang làm gì)

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. Di chuyển thư mục đó ra khỏi nhà ... nó đang làm gì ở đó vậy?

sudo mv /home/john/app2 /var/www/ 

Hãy nhớ thay đổi trang web để khớp với thư mục này và khởi động lại máy chủ apache.

Dưới đây là một số tài liệu tham khảo:

https://wiki.apache.org/httpd/13PermissionDenied

http://wiki.apache.org/httpd/FileSystemPermissions

Các vấn đề liên quan