Como o umask é calculado no Linux?

15

Então, eu sei que umaskpode restringir usuários privilegiados, usando este formato umask ugo.

Eu entendo que o read = 4, write = 2 e exec = 1. No entanto, quando eu digito umask, ele retorna 4 dígitos que é 0022ou 0073. Não entendo como isso funciona agora, porque há um dígito extra. Qual é esse dígito extra e o que faz0022 significa?

Braiam
fonte

Respostas:

18

Suponha que a máscara padrão 0666. umask0022 faça a nova máscara 0644 (0666-0022 = 0644), o que significa que o grupo e outras pessoas têm permissões de leitura (sem gravação ou execução).

O dígito "extra" (o primeiro número = 0) especifica que não há modos especiais.

Se o modo começar com um dígito, ele será interpretado como octal, caso contrário, deve ser simbólico.

0 é um dígito, assim como 1 (para o bit adesivo) ou 6 (para SGID). Um comando como chmodpode ser chamado por outros métodos, como chmod ug+rw mydironde você adicionaria as permissões de leitura e gravação ao usuário e ao grupo. Observe que o modo neste caso (ug + rw) não começa com um dígito; portanto, não seria interpretado como octal, mas simbólico.

Veja en.wikipedia.org/wiki/Chmod#Symbolic_examples para símbolos e também www.lifeaftercoffee.com/2007/03/20/special-permission-modes-in-linux-and-unix/ para um pouco de modos especiais.

Não sei se você desmascararia a primeira parte umask, mas tecnicamente poderia. Isso explicaria por que você quase sempre o vê como zero.

Crédito para pinkfloydx33

O primeiro dígito da máscara lida com permissões especiais que não se encaixam tão perfeitamente no modelo proprietário / grupo / outro. Quando quatro dígitos são fornecidos para uma permissão de arquivo, o primeiro se refere a esses valores especiais:

4000 = SUID
2000 = SGID
1000 = sticky bit

O bit SUID, abreviação de set-user-ID, faz com que um programa executável seja executado com a identificação de usuário efetiva (uid) do proprietário - em outras palavras, independentemente de quem o executa, o programa é executado com os direitos do proprietário. Isso geralmente é visto em programas que fazem coisas que exigem privilégios de root, mas devem ser executados por usuários normais: passwdé um exemplo.

O bit SGID, abreviação de set-group-ID, é muito semelhante, mas é executado com o ID do grupo efetivo (gid) do proprietário.

A parte complicada é um pouco mais complicada; se você quiser obter mais informações, leia a página de manual sticky.

Esses bits também podem ser usados ​​com diretórios, mas seus significados mudam.

Eu não acredito que você pode realmente definir o umask para permitir que você habilite qualquer um desses bits extras por padrão, mas você provavelmente nunca iria querer fazer isso de qualquer maneira.

Crédito para usuário470379

Braiam
fonte
1
Na verdade, você não pode fornecer um valor diferente de zero, exceto nos últimos três dígitos. De acordo com Posix: "A interpretação dos valores de modo que especificam bits de modo de arquivo diferentes dos bits de permissão de arquivo não é especificada". De acordo com man 2 umask(a chamada de sistema correspondente) "apenas os bits de permissão de arquivo masksão usados". No bash, umask 1000 gera um erro: "número octal fora do intervalo". Então, por que o 0 extra? Eu acho que é apenas para mostrar que o número está em octal.
Ri
que pastebin não tem nenhuma referência a umask, então não vejo como é relevante. O chmod permite que os três primeiros bits sejam definidos, mas umask não permite que eles sejam mascarados. (ou seja, você poderia ter escrito chmod 6777 dropboxE, a propósito, também. chmod ug+s.)
rici
Sim, você está certo, não sabe o que eu estava pensando.
Braiam
@Braiam: Sua fórmula para calcular a nova máscara está errada, não está 0666-0022, está 0666 & ~0022.
cuonglm
1
Acho que a objeção não é a maneira como os números são escritos, mas o uso do operador de subtração (-) em vez de bit a bit e (&).
BowlOfRed