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

6

Eu tenho um problema estranho com as permissões de diretório.

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

Mas eu me envolvi em um problema ao tentar criar um arquivo nessa pasta, fopen() retornou NULL e errno me disse Permission denied . Então eu verifiquei e, de fato, eu tinha as seguintes permissões na pasta que foi criada: dr----x--t

(a pasta raiz tem drwxrwxr-x )

Eu verifiquei, e esse incomum t significa "temporário", mas não faço ideia do que isso significa.

chmod 777 foldername do shell faz o trabalho e define os atributos para 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 desse atributo 'temporário'?

(o sistema é o Ubuntu 12.04)

    
por kebs 23.06.2014 / 11:04

4 respostas

5

t não é "temporário", isso significa que o bit pegajoso está definido. De man ls :

t [means that the] sticky bit is set (mode 1000), and is searchable or executable. (See chmod(1) or sticky(8).)

O bit pegajoso é definido aqui porque você ajustou decimal 777 (octal 1411), não octal 777 (decimal 511). Você precisa escrever 0777 para usar octal, não 777 .

Você também deve observar que o efeito final do argumento mode para mkdir também envolve AND contra seu umask. De man 2 mkdir :

The argument mode specifies the permissions to use. It is modified by the process's umask in the usual way: the permissions of the created directory are (mode & ~umask & 0777).

Sugiro que, se isso afetar você, você chmod após mkdir em vez de usar o argumento de modo.

Uma palavra final de aviso: o modo 777 é quase nunca o que você realmente quer fazer. Em vez de abrir o diretório globalmente para todos os usuários, considere configurar um modo apropriado e proprietário / grupo no diretório. Se você precisar de regras mais complicadas, considere o uso de ACLs.

    
por 23.06.2014 / 11:10
3

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

    
por 23.06.2014 / 11:10
2

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

mkdir( "foldername", 0777 );

Em segundo lugar, você precisa verificar suas configurações de umask para ter certeza de que realmente pode criar um inode com esses direitos.

Referências:

por 23.06.2014 / 11:10
2

Além de outras respostas legais, você pode definir umask para 000 antes de criar a pasta, para que você tenha a permissão correta desejada:

#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

Nota

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

mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);
    
por 23.06.2014 / 11:54