Права доступа к файлам Apache только в / tmp - PullRequest
0 голосов
/ 01 мая 2018

Я использую CentOS 7 и PHP 7.2.5. Я не могу получить move_uploaded_file (), file_put_contents () или exec ('cp /tmp/test.txt /var/www/html/test.txt', $ out); работать в любой папке кроме / tmp. / var / www / html принадлежит apache: apache и только для разрешений 755. Я пробовал 777, и я все еще получаю отказано в разрешении. Он застрял в папке systemd-private-123abc-httpd.service-11cba / tmp /, но я отключил PrivateTmp для httpd.

Загруженный файл загружен, и все хорошо, пока я не попытаюсь переместить его. Я могу переместить его в другое имя файла в каталоге / tmp, но не могу переместить его в любой другой каталог.

Все это прекрасно работает:

file_put_contents('/tmp/test.txt', 'TTTTTEEEESSSSTTTTT!!!!');
exec('cp /tmp/test.txt /tmp/test2.txt', $out); 
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], '/tmp/'.$file);

Все это выдает предупреждение: ***: не удалось открыть поток: отказано в разрешении

file_put_contents('/var/www/html/test.txt', 'TTTTTEEEESSSSTTTTT!!!!');
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], '/var/www/html/'.$file);
exec('cp /tmp/test.txt /var/www/html/test2.txt', $out); 

И снова, / var / www / html принадлежит apache: apache и имеет права доступа 755. Я полностью сбит с толку. Весь этот код прекрасно работал на старом сервере, но абсолютно отказывался работать на новом сервере. Я посмотрел и посмотрел, но если ответ там, он заблокирован слишком много ответов о стандартных разрешениях файла / каталога.

exec ('cp / ... на самом деле не дает предупреждений или ошибок. Он работает или не работает. Он может копировать в каталог / tmp, но нигде больше.

1 Ответ

0 голосов
/ 02 мая 2018

Как уже упоминалось в комментарии выше, проблема была в SELinux. Я отключил это, и все работало как ожидалось. Я не хотел оставлять это, поэтому я попытался установить правила, которые позволили бы мне то, что мне нужно, следуя этим указаниям . Это дало мне ошибки "semanage: error: нераспознанные аргументы: /var/www/html/test.txt"

Я запустил semanage fcontext -l> output.txt и извлек файл. Уже было правило (для WordPress и / или Drupal), разрешающее чтение / запись для любого каталога в / var / www / html с именем «uploads» /var/www/html(/.)?/uploads(/.)? все файлы system_u: object_r: httpd_sys_rw_content_t: s0

Итак, я переместил мой целевой каталог в каталог с «uploads» в пути. mv -f / var / www / html / shared / pics / * / var / www / html / shared / uploads / pics

Я разбил все это на apache: apache и установил разрешения на 755, и все работает как положено. Итак, если SELinux создает вам проблемы, и вы не можете изменить правила, найдите правила и следуйте им.

...