Я пытаюсь прочитать файл в 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/
to /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"
( "/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
разрешение на 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
)
Скорее всего, ваш пользователь 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.
Вот несколько ссылок: