Я сделал эксперимент:
Я вручную создал новую структуру каталогов / r / reuse / data с данными, имеющими все разрешения, затем попытался записать файл в данные, используя https://www.nsrusa.org/Tests/test.php .
<?php
// Test writing into new file outside of document root
error_reporting ( E_ALL);
ini_set ( "display_errors", "on");
file_put_contents ( "/r/reuse/data/test.txt", "hello world!");
?>
Я получил это сообщение об ошибке:
"Warning: file_put_contents(/r/reuse/data/test.txt): failed to open stream: No such file or directory in /home/nsr/public_html/Tests/test.php on line 6"
Почему это случилось?
ДОБАВЛЕНО 15.10.18:
Я добавил код для проверки существования каждого родительского каталога, и единственным, который был найден, был /. Таким образом, / r не был найден, хотя я создал его при запуске от имени пользователя root! Означает ли это, что программы, работающие от имени пользователя ‘nsr’, не могут видеть каталоги, созданные как ‘root’, несмотря на наличие прав доступа r и x на эти каталоги? Я не понимаю.
ДОБАВЛЕНО:
Я изменил владельца и группу каталога / r / reuse / data на nsr, но при запуске тестовой программы получил те же результаты, что и у пользователя ‘nsr’.
(Ответ предоставлен оригинальным постером)
Невозможность записи в каталоги и файлы, которые существуют за пределами корней документов всех веб-сайтов на сервере, возникает, когда включена настройка WHM «mod_ruid2 and jailshell». Благодаря поддержке WHM / cPanel я теперь понимаю причины.
Во-первых, я должен сказать, что причина, по которой я хотел иметь возможность записи в такой каталог, заключается в том, что я заинтересован в предоставлении общей библиотеки программных компонентов, сервисов и хранилища для нескольких не связанных между собой веб-сайтов (даже принадлежащих разным компаниям), написанных тот же дизайнер веб-сайта и существует на том же сервере.
Для этой цели в идеале мне нужно было создать общий каталог, принадлежащий root, на который все веб-сайты могут ссылаться для непосредственного чтения и записи (используя язык на стороне сервера, такой как PHP), для эффективности. Этот каталог явно должен существовать вне корней документов всех веб-сайтов, поскольку он будет содержать общую библиотеку программного обеспечения, используемого каждым веб-сайтом.
Я выполнил часть чтения, используя существующие механизмы, такие как PHP include_path и псевдоним Apache, что замечательно, но написание является проблемой, когда WHM «mod_ruid2 and jailshell» включен. Этот твик работает с Linux для создания смонтированных виртуальных файловых систем «только для чтения» с использованием команды, аналогичной «chroot», которая ограничивает доступ к файловой системе, так что запись не может происходить за пределами корневого каталога документа пользователя. Запись запрещена даже в том случае, если родительским каталогам предоставлены разрешения drwxrwxrwx, которые в чистом Linux разрешают запись любым пользователем (любым виртуальным хостом) на сервере.
Я надеюсь, что эта информация будет полезна для других, озадаченных тем, что PHP или другие серверные операции ввода-вывода не могут записать в каталоги вне корня документа. Твик WHM «mod_ruid2 and jailshell» запрещает доступ на запись без предоставления исключений.
Других решений пока нет …