Problema nas permissões de pasta criada: sinalizador temporário

Problema nas permissões de pasta criada: sinalizador temporário

Tenho um problema estranho com permissões de diretório.

De dentro de um aplicativo C++, crio uma pasta com: mkdir( "foldername", 777 );

Mas tive um problema ao tentar criar um arquivo naquela pasta, fopen()retornei NULLe errnome disse Permission denied. Então verifiquei e, de fato, tinha as seguintes permissões na pasta que foi criada:dr----x--t

(A pasta raiz tem drwxrwxr-x)

Eu verifiquei e isso incomum tsignifica "temporário", mas não tenho ideia do que isso significa.

chmod 777 foldernamedo shell faz o trabalho e define atributos como drwxrwxrwx, mas não consigo fazer isso manualmente todas as vezes.

Pergunta: alguma pista sobre o que está acontecendo? Por que meu aplicativo não define corretamente os atributos das pastas? Qual é o significado deste atributo “temporário”?

(o sistema é Ubuntu 12.04)

Responder1

tnão é "temporário", significa que o sticky bit está definido. De man ls:

t [significa que o] sticky bit está definido (modo 1000) e é pesquisável ou executável. (Veja chmod(1) ou sticky(8).)

A parte pegajosa está definida aqui porque você definiudecimal777 (octal 1411), nãooctal777 (decimal 511). Você precisa escrever 0777para usar octal, não 777.

Você também deve observar que o efeito final do modeargumento to mkdirtambém envolve AND em sua umask. De man 2 mkdir:

O argumento mode especifica as permissões a serem usadas. Ele é modificado pelo umask do processo da maneira usual: as permissões do diretório criado são (mode & ~umask & 0777).

Eu sugeriria que, se isso afetar você, você chmoduse mkdiro argumento mode em vez de usá-lo.

Uma última palavra de advertência: o modo 777 está quasenuncao que você realmente quer fazer. Em vez de abrir o diretório globalmente para todos os usuários, considere definir um modo e proprietário/grupo adequados no diretório. Se precisar de regras mais complicadas, considere usar ACLs.

Responder2

777para C é decimal. Você deve usar 0777para que seja tratado como octal.

Responder3

Você provavelmente deseja usar um número octal para o modo, em vez de um número decimal:

mkdir( "foldername", 0777 );

Em segundo lugar, você precisa verificar seuumaskconfigurações para garantir que você realmente possa criar um inode com esses direitos.

Referências:

Responder4

Além de outras boas respostas, você pode definir umaskantes 000de criar a pasta, para ter a permissão correta que deseja:

#include <stdio.h>                                                              
#include <sys/stat.h>                                                           

int main(void) {
    mode_t old_umask;                                                                
    old_umask = umask(0);                                                                   
    mkdir("tests", 0777);
    umask(old_umask);                                                       
}

Exemplo:

$ g++ -Wall mkdir.cpp 
$ ./a.out 
$ ls -ld tests
drwxrwxrwx. 2 cuonglm cuonglm 4096 Jun 23 16:55 tests

Observação

Em vez de usar o modo octal, você pode usar macros POSIX em mkdir:

mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);

informação relacionada