PHP создает директории с непонятными правами d-wxr----t

sanu0074

Новичок
Так создаются директории:
PHP:
    private function createFolder($folder){
        if (!file_exists($folder)) {
            umask(022);
            if (!mkdir($folder, 0777, TRUE)) {
              $data['state'] = "Server error, do not create content folder";
              jsonExit($data);
            } 
        }
    }
$folder содержит к примеру такую строку - "8956/xxhdpi/" В итогу папка 8956 будет иметь полные права, а вот xxhdpi получает права вида "d-wxr----t"

Как с этим бороться? p.s. я пробовал добавить umask 022 в envvars апача, но не помогло. Как такое возможно, что php создает каталоги и потом сам не может в них постучаться?
 

AnrDaemon

Продвинутый новичок
umask любая на самом деле.
Товарищ накосячил и не сознаётся.
 

sanu0074

Новичок
c0dex, а как должна выглядеть umask в моем случает, так "umask(0777)" ? И есть ли смысл писать это в envvars чтобы потом не юзать в коде всегда?
 

sanu0074

Новичок
PHP:
        $this->createFolder($route);
        $fileName = randName().".".end(explode(".", $_FILES['file']['name']));
        $filePath = $route.$fileName;

        umask(0777);
        if(!move_uploaded_file($_FILES['file']['tmp_name'], $filePath)){
            $data['state'] = "Upload error, file: ".$fileName." to: ".$route;
            jsonExit($data);
        }
        chmod($filePath, 0777);
Везде поменял на umask(0777), теперь говорит мне
move_uploaded_file(): Unable to move '/tmp/phpZ3JGPd' to 'data/content/2290/newavatar.png'
Теперь тут прав нехватает
/www/data/content/2290 d--------- 2 www-data www-data 4096 июля 22 10:06
Не могу разобраться с правами этими, раньше на winserver все работало, а теперь проект пришлось перенести на linux.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
потому что ты не удосужился пойти и прочитать что же это такое. umask не раздает права, а отбирает. По идее тебе umask вообще не нужен.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Есть в никсах дефолтная umask, равна - 0022 как правило.

Дефолтно файлы имеют права 666 (создаются неисполняемыми, так как не все файлы такими могут быть по природе) и 777 для папок, но применяемая umask - снимает некоторые биты, что изменяет права доступа к создаваемым файлам и папкам. Битовые маски прав доступа ты можешь погуглить, чтобы уж не все мне писать. Но в целом самое простое, что надо понимать - 7 - полные права на все, а 0 - отсутствие оных вообще.

Правда делятся на 3 категории, владелец, группа и остальные. Перед папкой выставляется флаг d, после которого в листинге как правило идут rwx права. Ниже пример для трех папок после использования ls -l

Код:
drwxr-xr-x  2 c0dex c0dex    4096 Oct 23  2014 phpinfo
drwxr-xr-x 11 c0dex c0dex    4096 Jan 23 18:15 phinx
drwxr-xr-x 11 c0dex c0dex    4096 Jan 28 12:29 laravel
Посмотреть какие права у тебя будут при текущей маске можно с помощью umask -S или посчитав какие биты она убирает, вызвав umask без аргументов.
Например, при маске 0022 у тебя будут права u=rwx,g=rx,o=rx (х для файлов в данном случае мы не учитываем, причина - выше).

То есть при базовых 0666 на файлы - у тебя в итоге выйдет 0644 права на файлы и 0755 на папки.

Прочитать можно тут: https://wiki.archlinux.org/index.php/Umask или в гугле.

Касательно твоего примера - это просто пример с мануала. Взять старую маску, создать папку и вернуть значение маски назад.
 
Сверху