Разрешения файла Apache только в / tmp

Я использую 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, но больше нигде.

Вы проверяли, включен ли SELinux?

cOle2 01.05.2018 23:13

cOle2 - Да, вот в чем проблема. Подробности в ответе ниже.

ABraut 01.05.2018 23:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
861
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как упоминалось в комментарии выше, проблема была в SELinux. Я отключил его, и все заработало, как ожидалось. Я не хотел оставлять его выключенным, поэтому я попытался установить правила, которые разрешили бы то, что мне нужно, следуя эти направления. Это дало мне ошибки "semanage: error: unrecognized arguments: /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

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

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

Если проблема не исчезла, попробуйте отключить систему privateTmp.

Я попробовал решение "multi-user.target.wants", оно сработало, но после перезапуска, но в какой-то момент PrivateTmp вернется к истине. Как и в основном я использую Apache2 в PHP, я наконец отредактировал php.ini и раскомментировал строку sys_temp_dir.

По умолчанию система использует временный каталог, назначенный функцией sys_get_temp_dir. Функция sys_get_temp_dir вернет "/ tmp", но правда в том, что ваши файлы tmp хранятся по некоторому пути, например /tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-YYYYYY//tmp/*. Итак, какая работа для меня была:

Отредактируйте php.ini (путь может меняться между версиями PHP)

sudo nano /etc/php/7.2/cli/php.ini

Затем раскомментируйте строку sys_temp_dir

; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"

Другие вопросы по теме