2012-04-04 21 views
5

Linux SSHPHP creado archivo | SSH No se puede eliminar (permiso denegado)

creo un archivo en php usando

if (!is_dir(DIR_FILE)) 
    mkdir(DIR_FILE, 0777); 

$filename = DIR_FILE . $id . '.txt'; 

$handle_cf = fopen($filename, 'a'); 
fwrite($handle_cf, $data . "\n"); 
fclose($handle_cf); 

chmod($filename, 0777); 

chown($filename, "usr111"); // usr111 = username 
chgrp($filename, "usr111"); // usr111 = group that is also attached to apache 

El archivo recibe los siguientes permisos.

-rwxrwxrwx 1 apache  apache  1447 Apr 4 12:48 D.txt 
-rwxrwxrwx 1 apache  apache  1447 Apr 4 12:48 E.txt 

Sin embargo, cuando intento eliminar el archivo, bajo la cuenta de usuario normal (usr111). Obtengo el siguiente error

[[email protected] session]$ rm D.txt 
rm: cannot remove `D.txt': Permission denied 

NOTA: Puedo eliminar el archivo en la raíz.

¡FIX FOUND! aunque estaba usando la configuración de modo en mkdir para php. Por alguna razón, esto no estaba funcionando. Agregué lo siguiente.

if (!is_dir($dir)) { 
     mkdir($dir, 0777); 

     chmod($dir, 0777); 
    } 
+2

¿cuáles son los permisos en el directorio de este archivo está en? –

+1

Si está iniciando sesión con una cuenta de usuario normal, PHP o más bien Apache es el propietario del archivo y no podrá eliminarlo a menos que tenga permisos para que todos puedan hacerlo. De lo contrario, si ha iniciado sesión con la raíz, no debería tener problemas. – Francisc

+0

+ MarcB drwxr-xr-x 2 apache apache 4096 4 de abril 12:48 sesión – RichardW11

Respuesta

2

mkdir está funcionando bien pero el segundo argumento no es el permiso que es un modo que será utilizado por el sistema, junto con su actual umask para calcular los permisos para fijar. De Manual:

El modo también se modifica por la máscara de usuario actual, que puede cambiar usando umask().

Es necesario cambiar la secuencia de comandos para establecer los permisos sin llamar al sistema de archivos en dos ocasiones:

$oldUmask = umask(0); // disable umask 
mkdir($path, 0777); 
umask($oldUmask); // reset the umask 
+0

Gracias por la explicación. – RichardW11

Cuestiones relacionadas