recursive - mkdir php
¿Cómo doy acceso de escritura PHP a un directorio? (11)
Solución simple de 3 pasos
Resumen: debe establecer el propietario del directorio para el usuario que utiliza PHP (usuario del servidor web) .
Paso 1: determinar el usuario de PHP
Crea un archivo PHP que contenga lo siguiente:
<?php echo `whoami`; ?>
Suba a su servidor web. El resultado debería ser similar al siguiente:
www-data
Por lo tanto, el usuario de PHP es www-data
.
Paso 2: determinar el propietario del directorio
A continuación, verifique los detalles del directorio web a través de la línea de comando:
ls -dl /var/www/example.com/public_html/example-folder
El resultado debería ser similar al siguiente:
drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder
Por lo tanto, el propietario del directorio es exampleuser1
.
Paso 3: cambiar el propietario del directorio a usuario de PHP
Luego, cambie el propietario del directorio web al usuario de PHP:
sudo chown -R www-data /var/www/example.com/public_html/example-folder
Verifique que el propietario del directorio web haya sido cambiado:
ls -dl /var/www/example.com/public_html/example-folder
El resultado debería ser similar al siguiente:
drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder
Por lo tanto, el propietario de example-folder
de example-folder
se ha cambiado correctamente al usuario de PHP: www-data
.
¡Hecho! PHP ahora debería poder escribir en el directorio.
Intento usar PHP para crear un archivo, pero no está funcionando. Estoy asumiendo que esto es porque no tiene acceso de escritura (siempre ha sido el problema antes). Traté de probar si este era el problema haciendo que la carpeta chmod 0777, pero eso acabara haciendo que cada script en ese directorio devolviera un mensaje de error 500 hasta que lo cambiara nuevamente. ¿Cómo doy acceso de escritura PHP a mi sistema de archivos para que pueda crear un archivo?
Editar: está alojado en host compartido de Hostgator usando Apache.
Editar 2: Alguien pidió el código: el código es un script de imagen GD. Sé que el resto funciona igual que antes. Estaba creando la imagen cada vez que se llamaba. Ahora intento crearlos cuando se agrega texto nuevo y guardarlos en una carpeta. La línea de escritura que tengo es: imagejpeg (null, $ file, 85);
También creé un archivo de prueba para comprobar si era solo un script roto (principalmente copiado de tizag): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (no sé si / cómo publicar el código aquí correctamente. Aquí está el contenido del script PHP, menos las etiquetas PHP).
Devuelve 13,13,1 (líneas separadas), por lo que parece que cree que escribió algo, pero el archivo de prueba está en blanco (subí uno en blanco) o inexistente (si lo eliminé).
Edición 3: el servidor ejecuta CentOS.
Descubrí que con HostGator tienes que establecer archivos en CMOD 644 y carpetas en 755. Desde que lo hice basándome en su soporte técnico, funciona con HostGator.
Establezca el propietario del directorio para el usuario que ejecuta Apache. A menudo nadie en Linux
chown nobody:nobody <dirname>
De esta forma, su carpeta no podrá ser editable en todo el mundo, pero podrá escribirla en apache :)
Estoy ejecutando Ubuntu, y como dije antes nadie: nadie no trabaja en Ubuntu. Usted obtiene el error:
chown: invalid group: ''nobody:nobody''
En su lugar, debe usar el ''nogroup'', como:
chown nobody:nogroup <dirname>
La mejor manera de dar acceso de escritura a un directorio ...
$dst = "path/to/directory";
mkdir($dst);
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
Primero, determine qué usuario posee el proceso httpd usando el siguiente comando
ps aux | grep httpd
obtendrá una respuesta de varias líneas como esta:
phpuser 17121 0.0 0.2 414060 7928 ? SN 03:49 0:00 /usr/sbin/httpd
Aquí la 1ra columna muestra el nombre de usuario. Así que ahora conoces al usuario que está tratando de escribir archivos, que en este caso es phpuser
. Ahora puedes seguir adelante y establecer el permiso para el directorio donde tu script php está intentando escribir algo:
sudo chown phpuser:phpuser PhpCanWriteHere
sudo chmod 755 PhpCanWriteHere
Puede cambiar los permisos de una carpeta con chmod () de PHP. Más información sobre cómo usar el comando está aquí: http://php.net/manual/en/function.chmod.php
Si obtiene un Error 500 al establecer los permisos en 777 (escritura mundial), significa que su servidor está configurado para evitar la ejecución de dichos archivos. Esto se hace por razones de seguridad. En ese caso, querrá usar 755 como los permisos más altos en un archivo.
Si hay un archivo error_log que se genera en la carpeta donde está ejecutando el documento PHP, querrá ver las últimas entradas. Esto le dará una idea de dónde está fallando el script.
Para obtener ayuda con la manipulación de archivos PHP, utilizo http://www.tizag.com/phpT/filewrite.php como recurso.
Puede establecer selinux en permisivo para analizar.
# setenforce 0
Selinux registrará pero permitirá acesses. Por lo tanto, puede consultar /var/log/audit/audit.log
para obtener más información. Tal vez necesites cambiar el contexto de selinux. Fot esto, chcon
comando chcon
. Si lo necesita, audit.log
su audit.log
a una respuesta más detallada.
No se olvide de habilitar Selinux después de haber resuelto el problema. Es mejor mantener selinux forzado.
# setenforce 1
Una forma muy sencilla es permitir que PHP cree el directorio en primer lugar.
<?php
$dir = ''myDir'';
// create new directory with 744 permissions if it does not exist yet
// owner will be the user/group the PHP script is run under
if ( !file_exists($dir) ) {
$oldmask = umask(0); // helpful when used in linux server
mkdir ($dir, 0744);
}
file_put_contents ($dir.''/test.txt'', ''Hello File'');
Esto le ahorra la molestia con permisos.
Yo tuve el mismo problema:
Como era reacio a dar 0777 a mi directorio php, creo un directorio tmp con derechos 0777, donde creo los archivos en los que necesito escribir.
Mi directorio php sigue estando protegido. Si alguien piratea el directorio tmp, el sitio continuará funcionando como siempre.
chmod no te permite establecer la propiedad de un archivo. Para establecer la propiedad del archivo, debe usar el comando chown.