1

У меня есть PHP-скрипт, который должен создать две новые папки в "альбомах" и "пл". в "альбомах" apache может создать новую папку, но не в "pl", даже если у них одинаковые разрешения. Я не могу понять, что я делаю не так.

ls -Z /music
drwxrwxrwx. apache root system_u:object_r:unlabeled_t:s0 albums
drwxrwxrwx. apache root system_u:object_r:unlabeled_t:s0 pl

PHP

function createdir($dir) {
        if (!is_dir($dir)) {
            mkdir($dir);
                if (is_dir($dir)) {
                        echo "PASS<br />";
                }else{
                        echo "FAILED<br />";
                }

        }else{
                echo "The dir is there";
        }

}

createdir("/music/pl/07012013/");
createdir("/music/albums/06012013333333331111/");

су апач

su - apache -s /bin/bash
-bash-4.1$ mkdir /music/pl/06012013
mkdir: cannot create directory `/music/pl/06012013': Permission denied

2 ответа2

1

Проверьте php's mkdir.

Вам нужно установить для recursive значение true, поэтому попробуйте что-то вроде mkdir($dir,0700,true)

-1

Поскольку это кажется общим вопросом со многими ответами, которые не охватывают все, с чем я столкнулся; Я добавлю свой опыт с этой проблемой и решение, которое действительно работало.

Я заметил, что вы не устанавливаете рекурсивный флаг, что вы не используете флаг полномочий и что вы не используете абсолютный путь к серверу.

Согласно абсолютному пути, это важно для обеспечения того, чтобы пользователь apache, www-data, действительно имел разрешения на изменение всего в непосредственной родительской папке.

Вы пробовали команду с флагом разрешений или экспериментировали с текущим представлением umask и восьмеричным (согласно PHP.net)? В настоящее время в документации PHP на mkdir указано, что если не указан параметр permissions, в системах Linux по умолчанию используется значение "777", которое является наименее ограничительным (и по соображениям безопасности не рекомендуется), и что в документации также говорится, что разрешения, вероятно, следует указывать в восьмеричный, поэтому к разрешениям следует добавить ведущий ноль. Также есть ссылки на текущий umask, который вы также можете проверить, потому что, если ваша текущая маска ненулевая, значение маски вычитается из фактического набора разрешений, если текущий umask равен 022, и вы указываете 777, разрешения вы получить 755.

В моем случае предложения PHP.net не устранили проблему, и когда я посмотрел на то, как эта проблема проявляется, оказалось, что у пользователя www-data отсутствуют некоторые необходимые разрешения для доступа, изменения или чтения созданных папок и файлы. Я попытался установить флаг разрешений как «6640», и это действительно сработало; Более того, это привело к тому, что все подкаталоги и файлы унаследовали разрешения «640» (рассмотрим 640 и добавление вашей учетной записи в группу www-data).

Короче говоря, есть два варианта, один из документации PHP, который не работает для меня, но может работать для некоторых:

$old = umask(0);
mkdir("/path/some_dir/", 0755, true);
umask($old);

Тот, который работал для меня, хотя и с несколько странным поведением:

$old = umask(0000);
mkdir("/var/www/html/somewebsite/images/somefolder/somefolder/", 6640, true);
umask($old);

Обратите внимание, что я на самом деле не предоставлял разрешения на выполнение в моем скрипте. Я заметил, что есть ряд других вариантов этого вопроса на других сайтах, которые нашли некоторую информацию PHP.net полезной в своем случае, но я включил ответ, который в итоге работал в моем случае. Я надеюсь, что эта информация поможет некоторым людям по крайней мере.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .