Por que umask 55 está configurando o arquivo mods para “222” ao invés de “111”?

1

Eu sei que:

  1. Um mod padrão do arquivo é 666
  2. O valor umask será removido dos mods padrão.

Então, por que quando eu defino o "umask" para 555 ele não define as permissões do arquivo recém-criado como 111 ? em vez disso, está configurando-os para 222

    
por Ravexina 13.08.2017 / 07:47

2 respostas

3

Resposta curta:

Porque com um 5 você está removendo o read (4) e executable (1) bit, então você acaba com apenas write (2) .

Explicação:

Com 555 você não está definindo o bit executável padrão.

It's wrong          =>          (6 - 5 = 1)

Temos estes mods:

  • 4 = ler
  • 2 = Escreva
  • 1 = executável

A única maneira de criar um 5 é de 4 + 1 , então 5 significa:

   4 (Read) + 1  (Executable)   =    5

Isso significa "remover" executáveis e ler mods se eles estiverem sendo definidos.

Em outras palavras, com umask 555 você está removendo o bit de leitura (4) e executável (1) do modo de arquivo padrão (6) que nos traz ao (2), porque em um 6 nós temos apenas um 4 e 2 para remover (não qualquer 1):

6  =  4   +   2

Você remove apenas o 4, então o arquivo termina com 222 .

Em binário

Pense nisso em binário:

1 -> 001
2 -> 010
3 -> 011
4 -> 100
5 -> 101
6 -> 110
7 -> 111

O modo padrão do arquivo é 666 (110 110 110) e nosso valor umask é 555 (101 101 101):

  Decimal title  ->         421 421 421
  666 in binary  ->         110 110 110
- 555 in binary  ->       - 101 101 101
                           _____________
                            010 010 010
                             2   2   2
                            -w- -w- -w-

Veja? nós acabamos no -w-w-w-, ou 222 .

    
por Ravexina 13.08.2017 / 07:47
2

O valor do umask do resultado é mask & 0777 ( pouco e )

Quando a máscara é 0555
Do que 0555 & Resultado 0777 com 0222

nixCraft understanding-linux-unix-umask-value-usage

Task: Calculating The Final Permission For FILES

You can simply subtract the umask from the base permissions to determine the final permission for file as follows:

666 – 022 = 644

File base permissions : 666
umask value : 022
subtract to get permissions of new file (666-022) : 644 (rw-r–r–)

Task: Calculating The Final Permission For DIRECTORIES

You can simply subtract the umask from the base permissions to determine the final permission for directory as follows:

777 – 022 = 755

Directory base permissions : 777
umask value : 022
Subtract to get permissions of new directory (777-022) : 755 (rwxr-xr-x)

A origem da diferença entre touch file e mkdir dir :

Note: as specify in this Unix Q&A

how the permission bits are hard-coded into the standard utilities. Here are some relevant lines from two files in the coreutils package that contains the source code for both touch(1) and mkdir(1), among others:

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

In other words, if the mode is not specified, set it to S_IRWXUGO (read: 0777) modified by the umask_value.

touch.c is even clearer:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

That is, give read and write permissions to everyone (read: 0666), which will be modified by the process umask on file creation, of course.

You may be able to get around this programmatically only: i.e. while creating files from within either a C program, where you make the system calls directly or from within a language that allows you to make a low-level syscall (see for example Perl's sysopen under perldoc -f sysopen).

man umask

umask() sets the calling process's file mode creation mask (umask) to mask & 0777 (i.e., only the file permission bits of mask are used), and returns the previous value of the mask.

    
por Yaron 13.08.2017 / 07:55