Tengo un problema extraño con los permisos del directorio.
Desde una aplicación C++, creo una carpeta con:
mkdir( "foldername", 777 );
Pero tuve un problema al intentar crear un archivo en esa carpeta, fopen()
regresé NULL
y errno
me dije Permission denied
. Así que verifiqué y, de hecho, tenía los siguientes permisos en la carpeta que se creó:dr----x--t
(La carpeta raíz tiene drwxrwxr-x
)
Lo comprobé y esto inusual t
significa "temporal", pero no tengo idea de lo que significa.
chmod 777 foldername
desde el shell hace el trabajo y establece atributos en drwxrwxrwx
, pero no puedo hacerlo manualmente cada vez.
Pregunta: ¿Alguna pista sobre lo que está pasando? ¿Por qué mi aplicación no configura correctamente los atributos de las carpetas? ¿Cuál es el significado de este atributo "temporal"?
(el sistema es Ubuntu 12.04)
Respuesta1
t
no es "temporal", significa que el bit adhesivo está colocado. De man ls
:
t [significa que] el bit adhesivo está configurado (modo 1000) y se puede buscar o ejecutar. (Ver chmod(1) o sticky(8).)
El bit adhesivo se establece aquí porque usted configuródecimal777 (octal 1411), nooctal777 (511 decimales). Necesitas escribir 0777
para usar octal, no 777
.
También debe tener en cuenta que el efecto final del mode
argumento mkdir
también implica hacer AND contra su umask. De man 2 mkdir
:
El modo de argumento especifica los permisos a utilizar. Es modificado por la umask del proceso de la forma habitual: los permisos del directorio creado son (mode & ~umask & 0777).
Yo sugeriría que si esto le afecta, chmod
en mkdir
lugar de utilizar el argumento modo.
Una última palabra de advertencia: el modo 777 está casinuncalo que realmente quieres hacer. En lugar de abrir el directorio globalmente a todos los usuarios, considere configurar un modo y propietario/grupo adecuados en el directorio. Si necesita reglas más complicadas, considere usar ACL.
Respuesta2
777
para C es decimal. Debes usarlo 0777
para que se trate como octal.
Respuesta3
Probablemente quieras usar un número octal para la moda, en lugar de uno decimal:
mkdir( "foldername", 0777 );
En segundo lugar, es necesario comprobar sumáscaraconfiguración para asegurarse de que realmente pueda crear un inodo con estos derechos.
Referencias:
página de manual de mkdir:http://man7.org/linux/man-pages/man2/mkdir.2.html
Respuesta4
Además de otras buenas respuestas, puede configurar umask
antes 000
de crear la carpeta, para que pueda tener el permiso correcto que desea:
#include <stdio.h>
#include <sys/stat.h>
int main(void) {
mode_t old_umask;
old_umask = umask(0);
mkdir("tests", 0777);
umask(old_umask);
}
Ejemplo:
$ g++ -Wall mkdir.cpp
$ ./a.out
$ ls -ld tests
drwxrwxrwx. 2 cuonglm cuonglm 4096 Jun 23 16:55 tests
Nota
En lugar de utilizar el modo octal, puede utilizar macros POSIX en mkdir
:
mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);