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.