![Problema nas permissões de pasta criada: sinalizador temporário](https://rvso.com/image/38670/Problema%20nas%20permiss%C3%B5es%20de%20pasta%20criada%3A%20sinalizador%20tempor%C3%A1rio.png)
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 NULL
e errno
me 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 t
significa "temporário", mas não tenho ideia do que isso significa.
chmod 777 foldername
do 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
t
nã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 0777
para usar octal, não 777
.
Você também deve observar que o efeito final do mode
argumento to mkdir
també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ê chmod
use mkdir
o 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
777
para C é decimal. Você deve usar 0777
para 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:
Página de manual do mkdir:http://man7.org/linux/man-pages/man2/mkdir.2.html
Responder4
Além de outras boas respostas, você pode definir umask
antes 000
de 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);