PHP: разрешение отклонено, несмотря на соответствующие разрешения
Я пытаюсь прочитать файл на 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
Настроить символические ссылки folllow (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
Любая идея о том, почему я получаю ошибку?
Ответы
Ответ 1
Для этого в вашем каталоге требуется разрешение execute
. Кажется, что мир не выполняется, и поскольку jenkins
, вероятно, не является пользователем apache, а пользователь apache не находится в группе adm
, он не работает:
$ ls -lh /var/lib/ | grep jenkins
drwxr-xr-- 6 jenkins adm 4.0K 2011-08-04 10:04 jenkins
В качестве примера:
[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
Даже если foo/bar
имеет разрешение 0777
, если каталог не имеет разрешения на выполнение, его содержимое не указано.
Вам потребуется разрешение для установки как для целевого каталога, так и для символической ссылки.
Ответ 2
Вам нужен бит выполнения, установленный для всех каталогов в иерархии до этого файла.
chmod o+x /var/lib/jenkins
должен сделать трюк.
(Примечание: ls -lhd /var/lib/jenkins
немного лучше, чем ls -lh ...|grep jenkins
)
Ответ 3
Скорее всего, ваш пользователь Apache не может читать или получать доступ к веб файлам
-
Проверьте, что пользователь работает с 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
-
Проверьте права собственности на свои веб файлы:
$ 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) сделать apache user 'john' в этом примере. Или вы можете (b) переместить веб-папку в место вне дома. Если доступ к выполнению может быть предоставлен группе или даже другим, не нарушая безопасных методов безопасности.
а. Сделайте apache user john (ТОЛЬКО ДЛЯ САЙТОВ DEV или если вы знаете, что делаете)
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
б. Переместите эту папку из дома... что она там делает?
sudo mv /home/john/app2 /var/www/
Не забудьте изменить сайт для соответствия этому каталогу и перезапустить сервер Apache.
Вот несколько ссылок:
https://wiki.apache.org/httpd/13PermissionDenied
http://wiki.apache.org/httpd/FileSystemPermissions