PHP mkdir: Problema de permissão negada


99

Eu estou tentando criar um diretório com a função mkdir PHP, mas eu recebo um erro como segue: Warning: mkdir() [function.mkdir]: Permission denied in .... Como resolver o problema?


2
Plataforma / servidor web / sistema operacional?
Salman A,

1
verifique esta questão: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir Eu estava tendo o mesmo problema e a resposta aqui apenas corrigiu meu problema. Se você estiver executando no Linux, a resposta lá sobre o SELinux pode se aplicar a você.
Lucas Madureira

Respostas:


171

Eu sei que este é um tópico antigo, mas precisa de uma resposta melhor. Você não deve precisar definir as permissões para 777, que é um problema de segurança, pois dá acesso de leitura e gravação para o mundo. Pode ser que o seu usuário apache não tenha permissões de leitura / gravação no diretório.

Aqui está o que você faz no Ubuntu

  1. Certifique-se de que todos os arquivos pertencem ao grupo e usuário Apache. No Ubuntu é o grupo www-data e o usuário

    chown -R www-data:www-data /path/to/webserver/www

  2. Em seguida, habilitou todos os membros do grupo www-data a ler e gravar arquivos

    chmod -R g+rw /path/to/webserver/www

A mkdir()função php agora deve funcionar sem retornar erros


3
Boa resposta! Esperamos que isso chegue ao topo da página com o tempo!
Altamente irregular,


O Apache precisa de permissão para escrever coisas como cache e logs ... é apenas uma questão de ajuste fino.
Manatax

@simpleengine Olá, percebi sua resposta. Estou enfrentando o mesmo problema com um projeto que estou tentando criar no CodeIgnter e desenvolvendo no Ubuntu 14.14 Lts .. Você poderia me explicar mais detalhadamente os passos que preciso fazer para corrigir esse erro ??? Para lhe dar algumas informações adicionais: o caminho absoluto é /opt/lampp/htdocs/www/my-app/public/uploads.. Basicamente o que estou tentando fazer é que cada usuário logado carregue arquivos dentro da pasta de uploads e também crie pastas de álbuns (isso será feito com php) para armazenar fotos ..
ltdev

5
Não gosto de usuários que ficam dizendo "não é seguro" sem mostrar a maneira segura de fazer isso.
che-azeh

38

Resposta tardia para pessoas que encontrarão isso no Google no futuro. Eu tive o mesmo problema.

NOTA: ESTOU NO MAC OSX LION

O que acontece é que o apache está sendo executado como o usuário "_www" e não tem permissão para editar nenhum arquivo. Você notará que nenhuma função do sistema de arquivos funciona via php.

Como consertar:

Abra uma janela de localização e, na barra de menus, escolha Ir> Ir para a pasta> / private / etc / apache2

agora abra httpd.conf

encontrar:

User _www 
Group _www

mude o nome de usuário:

User <YOUR LOGIN USERNAME>

Agora reinicie o apache executando este terminal de formulário:

sudo apachectl -k restart

Se ainda não funcionar, eu faço o seguinte antes de fazer o acima. Pode estar relacionado.

Abra o terminal e execute os seguintes comandos: (observe, meus arquivos do servidor da web estão localizados em / Library / WebServer / www. Altere de acordo com a localização do seu site)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*

6
Esta solução funciona, mas permite que o Apache cause estragos em seu sistema caso alguém o faça executar um código malicioso (por exemplo, através do exploit Shellshock). Uma alternativa seria deixar o Apache executando como _wwwe criar um grupo para você e o Apache. Faça um novo grupo, digamos chamado trusted, e coloque-se _wwwnele. Em seguida, torne confiável o proprietário do grupo de todos os arquivos no diretório de documentos do servidor. Finalmente, faça o que chmod g+rwxfor necessário apenas nos arquivos que o Apache precisa acessar, de modo que o trustedgrupo tenha permissão para editar os arquivos.
Chris Middleton,

3
apenas entrando na conversa para enfatizar novamente que essa resposta é uma má ideia. há muitos motivos muito bons para que os processos do Apache sejam propriedade de seus próprios usuários com fins especiais.
danyamachine

15

Não defina as permissões para 777 ao usar mkdir em PHP

As respostas apenas com links não são consideradas boas práticas no StackOverflow, mas o conselho que é fornecido aqui geralmente NÃO deve ser seguido.

Eu gostaria de voltar a esta ótima resposta em uma pergunta semelhante . Eu cito:

Pare de sugerir o uso de 777. Você está tornando seu arquivo gravável por todos, o que significa que você perde toda a segurança para a qual o sistema de permissão foi projetado. Se você sugerir isso, pense nas consequências que isso pode ter em um servidor web mal configurado: seria incrivelmente fácil "hackear" o site, sobrescrevendo os arquivos. Então, não faça isso.


9

Corrigir as permissões do diretório que você tentar criar um diretório no .


Acabei de resolver o problema da questão original alterando as permissões do arquivo para 755 recursivamente, usando o Filezilla. Clique com o botão direito na pasta pai, presumindo que seja algum tipo de pasta de repositório de arquivo geral na qual está tudo bem definir permissões 755, Atributos de arquivo -> Valor numérico -> 755 e marque "Recurse em subdiretórios". Demora alguns minutos para se propagar através dos subdiretórios se você tiver muitos arquivos. Em seguida, tente novamente.
TARKUS

7

Sei que esse tópico é antigo, mas talvez isso ajude alguém, um dia.

O problema por que o PHP diz "Permissão negada" para mkdir () - caminho de url errado. Então, para consertar, tudo que você precisa é obter o caminho correto. Eu fiz assim:

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>

1
Aconteceu comigo ao transferir para um novo host (que tem mysqlnd lol). Esqueci de mudar para o novo caminho completo do diretório inicial. Acontece que não era realmente um problema de permissão.
JSG de

2

Você precisa ter permissão do sistema de arquivos para criar o diretório.

Exemplo: No Ubuntu 10.04 apache (php) é executado como usuário: www-data no grupo: www-data

Significa que o usuário www-data precisa de acesso para criar o diretório.

Você pode tentar fazer isso usando: 'su www-data' para se tornar o usuário www-data.

Como uma solução rápida, você pode fazer: sudo chmod 777 my_parent_dir


14
chmod 0777dará acesso de leitura e escrita ao mundo! Você não deve aconselhar algo assim. No entanto, o conselho com o grupo de usuários é atualmente o melhor aqui :)
KingCrunch

1
Se o mundo tiver acesso ao sistema operacional, com certeza. A melhor maneira seria: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig,

Ou deixe as permissões de lado e adicione www-data ao grupo do diretório pai.
Marc B,

0

Outra coisa que você pode fazer é acessar: / etc / sudoers

Adicione a seguinte linha que dá permissão a esse usuário www-data ALL = (ALL: ALL) ALL Por que www-data? isso ocorre porque o apache está sendo executado por este nome de usuário.

Caso seu usuário seja diferente, tente o nome de usuário ALL = (ALL: ALL) ALL

Isso funcionou para mim.


5
não edite sudoersdiretamente, mas faça login como root e use o visudocomando te : que verifica todas as alterações para evitar edições defeituosas, que pode causar erros de análise quando o arquivo sudoers é carregado, o que pode deixá-lo impotente (como em nenhum direito de mudar qualquer coisa)
Elias Van Ootegem

Como encontrar o nome de usuário. como www-data? Estou usando o nginx, mas não funciona
robspin

1
@robspin tente isso: ps aux | egrep '(nginx)'
maxwells

0

Como você está em um mac, pode se adicionar ao grupo _www (o grupo de usuários apache) no seu mac:

sudo dseditgroup -o edit -a $USER -t user _www

e adicione _www user ao grupo wheel que parece ser o que o mac cria arquivos como:

sudo dseditgroup -o edit -a _www -t user wheel

0

Estou com este problema agora, minha melhor solução que posso dar a você agora (apesar de você não ter incluído nenhum de seu código) seria:

  1. Verifique como você nomeia sua pasta de destino, por exemplo: new_folder (às vezes isso pode causar erro de permissão, pois a maioria dos hosts não permite que nomes usando sublinhado, traço, etc. sejam criados em tempo de execução). Funcionou para mim
  2. Se você estava usando o comando recursivo para criar subpastas, não se esqueça de colocar 0755 (lembre-se de incluir 0 no início) no comando mkdir, por exemplo:

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }

Isso também funcionou para mim agora.


3
777 é um problema de segurança
MaicolBen

Editado agora mesmo, para 0755
arungisyadi

0

Se você estiver usando o LINUX, primeiro vamos verificar o usuário do apache, já que em algumas distros pode ser diferente:

egrep -i '^user|^group' /etc/httpd/conf/httpd.conf 

Digamos que o resultado seja "http". Faça o seguinte, lembre-se de alterar path_to_folder para folders path:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder

0

verifique se não é um problema com umask

if (!function_exists('mkdir_r')) {
    /**
     * create directory recursively
     * @param $dirName
     * @param int $rights
     * @param string $dir_separator
     * @return bool
     */
    function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
        $dirs = explode($dir_separator, $dirName);
        $dir = '';
        $created = false;
        foreach ($dirs as $part) {
            $dir .= $part . $dir_separator;
            if (!is_dir($dir) && strlen($dir) > 0) {
                $created = mkdir($dir, $rights);
            }
        }
        return $created;
    }
}

if (!function_exists('ensure_dir')) {
    /**
     * ensure directory exist if not create 
     * @param $dir_path
     * @param int $mode
     * @param bool $use_mask
     * @param int $mask
     * @return bool
     */
    function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
        // set mask 
        $old_mask = $use_mask && $mask != null
            ? umask($mask)
            : null;
        try {
            return is_dir($dir_path) || mkdir_r($dir_path, $mode);
        } finally {
            if ($use_mask && $old_mask != null) {
                // restore original
                umask($old_mask);
            }
        }
    }
}

0

Depois de instalar o servidor ftp, sudo apt-get install vsftpdvocê terá que configurá-lo. Para habilitar o acesso de gravação, você deve editar o /etc/vsftpd.confarquivo e descomentar o

#write_enable=YES

linha, então deve ser

write_enable=YES

Salve o arquivo e reinicie vsftpdcomsudo service vsftpd restart .

Para outras opções de configuração, consulte esta documentação ouman vsftpd.conf


0

Este erro ocorre se você estiver usando o caminho errado.

Por exemplo:

Estou usando o sistema Ubuntu e o nome da minha pasta de projeto é 'myproject'

Suponha que eu tenha o diretório myproject / public / report e queira criar uma nova pasta chamada orders

Então eu preciso de todo um caminho onde meu projeto exista. Você pode obter o caminho pelo comando PWD

Portanto, meu caminho de raiz será = '/ home / htdocs / myproject /'

$ dir = '/ home / htdocs / myproject / public / report / Orders';

if (!is_dir($dir)) {
   mkdir($dir, 0775, true);
}

Vai funcionar para você !! Aproveitar !!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.