Problema con los permisos de la carpeta creada: indicador temporal

Problema con los permisos de la carpeta creada: indicador temporal

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é NULLy errnome 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 tsignifica "temporal", pero no tengo idea de lo que significa.

chmod 777 foldernamedesde 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

tno 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 0777para usar octal, no 777.

También debe tener en cuenta que el efecto final del modeargumento mkdirtambié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, chmoden mkdirlugar 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

777para C es decimal. Debes usarlo 0777para 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:

Respuesta4

Además de otras buenas respuestas, puede configurar umaskantes 000de 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);

información relacionada