Как заставить lampp создавать папки с разрешением 777

Рейтинг: -1Ответов: 1Опубликовано: 18.05.2023

Есть Ubuntu 20.4, Lampp. Нужно перенести файлы из одной папки в другую, которая создается динамически с именем, указанным пользователем. Создаю папки (php) mkdir($destination, 0777, true), по итогу разрешение 411 (owner daemon). Принудительно пишу chmod($destination,777), не помогает. Ну и раз папка без доступа то получаю ошибку при выполнении команды copy($source.$file, $destination.$file). Новые папки пробовал и в htdocs и home/user - результат одинаковый. Куда копать ?

Ответы

▲ 1

На Unix*-системах веб-сервер и выполняемые под ним скрипты (в том числе php) как правило выполняются от отдельного пользователя - www-data (может различаться в зависимости от веб-сервера [nginx, apache2] и собственно ОС. Естественно, что у данного пользователя нет прав в домашние папки других пользователей (/home/<username>) и довольно сильно ограничены права на корневую папку где расположен сам сайт.

Проверяем под каким пользователем у нас запущен веб-сервер, для этого добавляем в наш php-скрипт вывод команды whoami

echo exec('whoami');

Результат как правило такой:

www-data

Если у Вас такой же, дайте этому пользователю на ту папку, где Вы будете создавать подпапки с файлами, соответствующие права. Допустим у Вас это папка /var/wwww/html

Для начала назначьте на эту папку с помощью команды chown или же через midnight commander (встаньте курсором на папку, нажмите F9 выберите меню Файл\Владелец/Группа) владельцем группу www-data.

После этого назначьте с помощью команды chmod или же midnight commander (встаньте курсором на папку, нажмите F9 выберите меню Файл\Права доступа) следующие права чтение для группы, запись для группы

Теперь попробуйте в этой папке из php-скрипта создать под-папку и простой текстовый файл в ней.

echo "Создание под-папки...";
//Так как у группы `www-data` есть права на корневую папку `/var/www/html`
//то и владельцем всех создаваемых под-папок будет тоже она
//и соответственно прав по-умолчания (0644) ей будет достаточно 
//и явно указывать их в `mkdir` не нужно
if ( @mkdir('/var/www/html/test') ) {
    echo "успешно!\n";
    echo "Создание файла в под-папке...";
    if ( @file_put_contents('/var/www/html/test/test.txt', '12345') !== false ) {
        echo "успешно!\n";
        //Заодно протестируем и удаление
        echo "Удаление файла в под-папке...";
        if ( @unlink('/var/www/html/test/test.txt') ) {
            echo "успешно!\n";
            echo "Удаление под-папки...";
            if ( @rmdir('/var/www/html/test') ) {
                echo "успешно!\n";
                die();
            }            
        }
    }
} 
echo "ошибка!. Не хватает прав?\n";

Если все выполнилось успешно - можете реализовывать работу Ваших собственных скриптов.