PHP: mkdir (): Permissão negada

1

Eu tenho um script PHP que deve criar duas novas pastas em "álbuns" e "pl". em "albums" o apache pode criar uma nova pasta mas não em "pl", mesmo que tenham as mesmas permissões. Eu não consigo entender o que estou fazendo errado.

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

su - apache -s /bin/bash
-bash-4.1$ mkdir /music/pl/06012013
mkdir: cannot create directory '/music/pl/06012013': Permission denied
    
por teslasimus 05.01.2013 / 23:18

2 respostas

1

Confira o mkdir do php .

Você precisará definir recursiva como true, então tente algo como mkdir($dir,0700,true)

    
por 06.01.2013 / 00:48
-1

Como isso parece ser uma pergunta comum com muitas respostas que não cobrem tudo o que eu encontrei; Vou adicionar minha experiência com esse problema e a solução que realmente funcionou.

Percebi que você não está configurando o sinalizador recursivo, que não está usando o sinalizador de permissões e que não parece estar usando o caminho absoluto para o servidor.

De acordo com o caminho absoluto, é relevante garantir que o usuário do apache, www-data, realmente tenha permissões para modificar tudo na pasta pai imediata.

Já experimentou o comando com o sinalizador de permissões ou experimentou a representação atual de umask e octal (de acordo com PHP.net)? Atualmente a documentação do PHP no mkdir indica que se nenhum parâmetro de permissão for especificado, os sistemas Linux usarão como padrão "777", que é o menos restritivo (e por razões de segurança não aconselhadas) e que a documentação também diz que as permissões devem ser especificadas octal, então um zero inicial deve ser adicionado às permissões. Há também referências à umask atual que você pode querer verificar também, porque se sua máscara atual for diferente de zero, o valor da máscara é subtraído do conjunto de permissões real, se a umask atual for 022 e você especificar 777, as permissões get são 755.

No meu caso, as sugestões do PHP.net não corrigiram o problema e, quando analisei como esse problema estava se manifestando, descobriu-se que o usuário do www-data carecia de algumas das permissões necessárias para acessar, modificar ou ler o pastas e arquivos criados. Eu tentei definir o sinalizador de permissões como '6640' e ele realmente funcionou; além disso, fez com que todos os sub-diretórios e arquivos herdam as permissões '640' (considere 640 e adicione sua conta ao grupo www-data).

Em suma, existem duas opções para tentar, uma da documentação do PHP que não funcionou para mim, mas pode funcionar para alguns:

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

O que funcionou para mim, embora com um comportamento um pouco peculiar:

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

Observe que, na verdade, não concedi permissões de execução no meu script. Tenho notado que há uma série de outras variações desta questão em outros sites que encontraram algumas das informações do PHP.net úteis no caso deles, mas incluí a resposta que acabou funcionando no meu caso. Espero que esta informação ajude algumas pessoas, pelo menos.

    
por 07.01.2018 / 11:40