PHP mkdir: problema de permiso denegado

99

Estoy tratando de crear un directorio con la función mkdir PHP, pero me da un error de la siguiente manera: Warning: mkdir() [function.mkdir]: Permission denied in .... ¿Cómo solucionar el problema?

folos
fuente
2
¿Plataforma / servidor web / sistema operativo?
Salman A
1
revise esta pregunta: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir Estaba teniendo el mismo problema y la respuesta aquí simplemente solucionó mi problema. Si está ejecutando Linux, la respuesta sobre SELinux podría aplicarse a usted.
Lucas Madureira

Respuestas:

171

Sé que este es un hilo antiguo, pero necesita una mejor respuesta. No debería necesitar establecer los permisos en 777, ese es un problema de seguridad ya que brinda acceso de lectura y escritura al mundo. Puede ser que su usuario de apache no tenga permisos de lectura / escritura en el directorio.

Esto es lo que haces en Ubuntu

  1. Asegúrese de que todos los archivos sean propiedad del grupo y del usuario de Apache. En Ubuntu es el grupo de datos www y el usuario

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

  2. Luego habilitó a todos los miembros del grupo www-data para leer y escribir archivos

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

La mkdir()función php ahora debería funcionar sin devolver errores

simple motor
fuente
3
¡Buena respuesta! ¡Con suerte, esto llegará a la parte superior de la página con el tiempo!
Altamente irregular
16
Esta es una muy mala idea .
Big McLargeHuge
Apache necesita permiso para escribir cosas como caché y registros ... es solo una cuestión de ajuste.
Manatax
@simpleengine Hola, me di cuenta de tu respuesta ... Estoy enfrentando el mismo problema con un proyecto que estoy tratando de crear en CodeIgnter y que estoy desarrollando en Ubuntu 14.14 Lts ... ¿Podrías explicarme más detenidamente los pasos que necesito para hacer para corregir este error ??? Para brindarle información adicional: la ruta absoluta es /opt/lampp/htdocs/www/my-app/public/uploads... Básicamente, lo que estoy tratando de hacer es que cada usuario que haya iniciado sesión cargue archivos dentro de la carpeta de cargas y también cree carpetas de álbumes (esto se hará con php) para almacenar fotos ..
ltdev
5
No me gustan los usuarios que siguen diciendo "es inseguro" sin mostrar la forma segura de hacerlo.
che-azeh
38

Respuesta tardía para las personas que encuentren esto a través de Google en el futuro. Tuve el mismo problema.

NOTA: ESTOY EN MAC OSX LION

Lo que sucede es que apache se está ejecutando como el usuario "_www" y no tiene permisos para editar ningún archivo. Notarás que NO hay funciones del sistema de archivos que funcionen a través de php.

Como arreglar:

Abra una ventana del buscador y en la barra de menú, elija Ir> Ir a carpeta> / private / etc / apache2

ahora abre httpd.conf

encontrar:

User _www 
Group _www

cambiar el nombre de usuario:

User <YOUR LOGIN USERNAME>

Ahora reinicie Apache ejecutando este formulario de terminal:

sudo apachectl -k restart

Si aún no funciona, hago lo siguiente antes de hacer lo anterior. Podría estar relacionado.

Abra el terminal y ejecute los siguientes comandos: (tenga en cuenta que los archivos de mi servidor web se encuentran en / Library / WebServer / www. Cambie según la ubicación de su sitio web)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
Chris Ingis
fuente
6
Esta solución funciona, pero permite que Apache cause estragos en su sistema si alguien consigue que ejecute código malicioso (por ejemplo, a través del exploit Shellshock). Una alternativa sería dejar Apache ejecutándose como _wwwy crear un grupo para usted y Apache. Haga un nuevo grupo, diga llamado trusted, y colóquese _wwwen él. Luego, confíe en el propietario del grupo de todos los archivos en el directorio de documentos de su servidor. Finalmente, haga lo chmod g+rwxque sea necesario solo en los archivos a los que Apache necesita acceder, de modo que el trustedgrupo tenga permiso para editar los archivos.
Chris Middleton
3
simplemente repicando para volver a enfatizar que esta respuesta es una mala idea. Hay muchas muy buenas razones por las que los procesos de Apache son propiedad de sus propios usuarios con fines especiales.
danyamachine
15

No configure los permisos en 777 cuando use mkdir en PHP

Las respuestas de solo enlace no se consideran una buena práctica en StackOverflow, pero los consejos que se dan aquí generalmente NO deben seguirse.

Me gustaría volver a esta gran respuesta sobre una pregunta similar . Yo cito:

Deje de sugerir el uso de 777. Está haciendo que todos puedan escribir en su archivo, lo que significa que perderá toda la seguridad para la que fue diseñado el sistema de permisos. Si sugiere esto, piense en las consecuencias que puede tener en un servidor web mal configurado: sería increíblemente fácil "piratear" el sitio web sobrescribiendo los archivos. Entonces, no lo hagas.

Marchitar
fuente
9

Fijar los permisos del directorio intenta crear un directorio en .

Erik
fuente
Acabo de resolver el problema en la pregunta original cambiando los permisos de archivo a 755 de forma recursiva, usando Filezilla. Haga clic derecho en la carpeta principal, asumiendo que es algún tipo de carpeta de repositorio de archivos general en la que está bien establecer 755 permisos, luego Atributos de archivo -> Valor numérico -> 755, luego marque "Recurrir a subdirectorios". Tarda un par de minutos en propagarse a través de los subdirectorios si tiene muchos archivos. Vuelva a intentarlo.
TARKUS
7

Sé que este hilo es antiguo, pero quizás esto ayude a alguien, algún día.

El problema por el que PHP dice "Permiso denegado" para mkdir () - ruta URL incorrecta. Entonces, para solucionarlo, todo lo que necesita es obtener la ruta correcta. Lo hice de esta manera:

<?php

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

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

?>
Boris
fuente
1
Me pasó al transferirme a un nuevo host (que tiene mysqlnd lol). Olvidé cambiar a la nueva ruta completa del directorio de inicio. Resulta que en realidad no fue un problema de permisos.
JSG
2

Debe tener permiso del sistema de archivos para crear el directorio.

Ejemplo: en Ubuntu 10.04 apache (php) se ejecuta como usuario: www-data en el grupo: www-data

Lo que significa que el usuario www-data necesita acceso para crear el directorio.

Puede intentarlo usted mismo utilizando: 'su www-data' para convertirse en el usuario de www-data.

Como solución rápida, puede hacer: sudo chmod 777 my_parent_dir

Jon Skarpeteig
fuente
14
chmod 0777le dará acceso de lectura y escritura al mundo! No deberías aconsejar algo así. Sin embargo, el consejo con el grupo de usuarios es actualmente el mejor aquí :)
KingCrunch
1
Si el mundo tiene acceso al sistema operativo, seguro. La mejor manera sería: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig
O deje los permisos solo y agregue www-data al grupo del directorio principal.
Marc B
0

La otra cosa que puede hacer es ir a: / etc / sudoers

Añada la siguiente línea que le da permiso a ese usuario www-data ALL = (ALL: ALL) ALL ¿Por qué www-data? esto se debe a que apache se ejecuta con este nombre de usuario.

En caso de que su usuario sea diferente, pruebe el nombre de usuario TODOS = (TODOS: TODOS) TODOS

Esto funcionó para mí.

Maxwells
fuente
5
no edite sudoersdirectamente, inicie sesión como root y use el visudocomando te : que verifica cualquier cambio para evitar ediciones defectuosas, que pueden causar errores de análisis cuando se carga el archivo sudoers, lo que puede dejarlo impotente (como en cambiar algo)
Elias Van Ootegem
Cómo encontrar el nombre de usuario. como www-data? Estoy usando nginx pero no trabajo
robspin
1
@robspin prueba esto: ps aux | egrep '(nginx)'
maxwells
0

Ya que está en una Mac, puede agregarse al grupo _www (el grupo de usuarios de Apache) en su Mac:

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

y agregue _www user al grupo de la rueda que parece ser lo que la mac crea archivos como:

sudo dseditgroup -o edit -a _www -t user wheel
SeanJA
fuente
0

Tengo este problema en este momento, mi mejor solución que puedo darte ahora mismo (a pesar de que no incluiste ninguno de tu código) sería:

  1. Verifique cómo nombra su carpeta de destino, por ejemplo: new_folder (a veces esto puede causar un error de permiso ya que la mayoría de los hosts no permiten que se creen nombres con guión bajo, guión, etc. en tiempo de ejecución). Funcionó para mí.
  2. Si estaba utilizando un comando recursivo para crear subcarpetas, no olvide poner 0755 (recuerde incluir 0 al principio) en el comando mkdir, por ejemplo:

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

Esto también me funcionó en este momento.

Arungisyadi
fuente
3
777 es un problema de seguridad
MaicolBen
Editado hace un momento, para 0755
arungisyadi
0

Si está usando LINUX, primero verifiquemos al usuario de apache, ya que en algunas distribuciones puede ser diferente:

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

Digamos que el resultado es "http". Haga lo siguiente, solo recuerde cambiar path_to_folder a la ruta de las carpetas:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
Marcelo Agimóvel
fuente
0

compruebe si no es un problema con 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);
            }
        }
    }
}
ceph3us
fuente
0

Después de instalar el servidor ftp sudo apt-get install vsftpd, tendrá que configurarlo. Para habilitar el acceso de escritura, debe editar el /etc/vsftpd.confarchivo y descomentar el

#write_enable=YES

línea, por lo que debería leer

write_enable=YES

Guarde el archivo y reinicie vsftpdcon sudo service vsftpd restart.

Para otras opciones de configuración, consulte esta documentación oman vsftpd.conf

mi sol
fuente
0

Este error ocurre si está utilizando la ruta incorrecta.

Por ejemplo:

Estoy usando el sistema ubuntu y el nombre de la carpeta de mi proyecto es 'myproject'

Supongamos que tengo el directorio myproject / public / report y quiero crear una nueva carpeta llamada orders

Entonces necesito un camino completo donde existe mi proyecto. Puede obtener la ruta mediante el comando PWD

Entonces mi ruta raíz será = '/ home / htdocs / myproject /'

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

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

¡Funcionará para ti! Disfruta !!

Umang Soni
fuente