2011-08-04 27 views
12

Próbuję odczytać plik w PHP i otrzymuję błąd odmowy uprawnień, mimo że wszyscy mają dostęp do pliku do odczytu.Odmowa uprawnień pomimo odpowiednich uprawnień przy użyciu PHP

Kod PHP:

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

Błąd:

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

Pozwolenie plików:

Jest dowiązaniem wskazując /opt/jenkins/home/ do /var/lib/jenkins i każdy ciało ma uprawnienia do odczytu w dowiązaniu symbolicznym, folderze i pliku.

$ 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 

konfiguracyjne apache'a

skonfigurowana do folllow symlinki (Options All). Dodanie dyrektywy Directory dla /var/lib/jenkins/ nie ma znaczenia.

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

Dodatkowe informacje

Czy mogę użyć ścieżki przez dowiązanie symboliczne ("/opt/jenkins/home/config.xml") lub realnej ścieżki ("/var/lib/jenkins/config.xml") Mam ten sam problem.

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

Każdy pomysł, dlaczego otrzymuję błąd?

+1

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

+0

czy apache jest skonfigurowany tak, aby śledzić dowiązania symboliczne? afaik istnieje opcja SymLink – knittl

+0

dzięki za komentarze, ale proszę przeczytaj uważnie pytanie (chcę przeczytać plik, i tak, apache jest skonfigurowany tak, aby podążał za dowiązaniami symbolicznymi). – Max

Odpowiedz

11

Twój katalog wymaga execute pozwolenia, aby to zadziałało. To nie wydaje się mieć świat wykonać, a od jenkins prawdopodobnie nie jest apache użytkownika, a użytkownik apache nie jest w grupie adm, to nie będzie działać:

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

Na przykład:

[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 

Mimo że foo/bar ma uprawnienie 0777, jeśli katalog nie ma uprawnień do wykonywania, odczytywanie jego zawartości jest zabronione.

Potrzebne jest uprawnienie do ustawienia zarówno dla katalogu docelowego, jak i dowiązania symbolicznego.

+0

Musi więc ustawić wykonanie poprawnie na prawdziwym katalogu lub na dowiązaniu symbolicznym? –

+0

@Clement Herreman: Both. Edytowana odpowiedź. :) – netcoder

+0

** musi ** być ustawiony na obu lub na tym, którego używa w swoim 'file_get_contents()'? –

7

Potrzebny jest zestaw bitów wykonania dla wszystkich katalogów w hierarchii do tego pliku.

chmod o+x /var/lib/jenkins 

powinien załatwić sprawę.

(Uwaga: ls -lhd /var/lib/jenkins jest nieco lepiej niż ls -lh ...|grep jenkins)

+0

Prawidłowo. +1 dla ls -d. – Max

0

Najprawdopodobniej użytkownik apache nie może odczytać lub dostępu do plików internetowych

  1. Sprawdź, co użytkownik apache działa jako:

    $ 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. Sprawdź własność ścieżka plików internetowych:

    $ 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. Ustaw uprawnienia odpowiednio:

Również w tym etapie będę pozostawić go do ciebie, można albo (a)make apache użytkownik 'John' w tym przykładzie. Lub możesz (b)przenieść folder sieci Web do miejsca poza domem. W przypadku, gdy dostęp do wykonania można przekazać grupie lub nawet innym osobom bez naruszania dobrych praktyk bezpieczeństwa.

a. Uczyń użytkownika Apache John (TYLKO DLA DEV SITES lub jeśli wiesz co robisz)

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. Przenieś ten folder z domu ... co on tam robi?

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

Należy pamiętać o zmianie witryny w celu dopasowania do tego katalogu i zrestartowaniu serwera apache.

Oto niektóre odniesienia:

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

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

Powiązane problemy