O que é "umask" e como funciona?

190

Acredito que umask é algo que controla as permissões de arquivo , mas não o entendo completamente.

Depois de executar umask 0644em um terminal , não consigo ler os arquivos criados com o editor de texto da linha de comando nano. Notei que as permissões desse arquivo estão definidas como em 0022vez do padrão 0755.

Como umask funciona? Eu pensei que eu poderia apenas remover a cada dígito na umask partir 0777, 7 - 6 = 1e 7 - 4 = 3, por isso espero que as permissões para ser 0133, mas, aparentemente, este não é o caso.

  1. O que é umask exatamente? Explique-me como se eu fosse um "Linux noob"
  2. Como faço para calcular com umask?
  3. O que são casos de uso para umask?
Lekensteyn
fonte
app_mode 666 rw- rw- rw- umask 644 --0 -00 -00 file_mode 022 --- -w- -w-
grabantot

Respostas:

143

O umask atua como um conjunto de permissões que os aplicativos não podem definir nos arquivos. É uma máscara de criação de modo de arquivo para processos e não pode ser definida para os próprios diretórios. A maioria dos aplicativos não criaria arquivos com permissões de execução definidas, portanto, eles teriam um padrão de 666, que é modificado pelo umask.

Como você configurou o umask para remover os bits de leitura / gravação do proprietário e os bits de leitura de outros, um padrão, como 777nos aplicativos, resultaria em permissões de arquivo 133. Isso significaria que você (e outros) poderiam executar o arquivo e outros seriam capazes de gravá-lo.

Se você quiser fazer com que os arquivos não sejam lidos / gravados / executados por qualquer pessoa, exceto pelo proprietário, você deve usar umask como 077para desativar essas permissões para o grupo e outros.

Por outro lado, uma umask 000tornará os diretórios recém-criados legíveis, graváveis ​​e descendentes para todos (as permissões serão 777). Essa umask é altamente insegura e você nunca deve configurá-la para 000.

O umask padrão no Ubuntu era o 022que significa que os arquivos recém-criados são legíveis por todos, mas somente graváveis ​​pelo proprietário:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw-r--r-- 1 user user 0 Apr  1 19:15 new-file-name

A partir do Ubuntu Oneiric (11.10), o umask padrão foi relaxado 002, o que expande o acesso de gravação ao grupo do proprietário:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw-rw-r-- 1 user user 0 Apr  1 19:15 new-file-name

Visualizando e Modificando umask

Para visualizar sua configuração atual do umask, abra um terminal e execute o comando:

umask

Para alterar a configuração umask do shell atual para outra coisa, digamos 077, execute:

umask 077

Para testar se essa configuração funciona ou não, você pode criar um novo arquivo (as permissões de arquivo de um arquivo existente não serão afetadas) e mostrar informações sobre o arquivo, execute:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw------- 1 user user 0 Apr  1 19:14 new-file-name

A configuração do umask é herdada pelos processos iniciados no mesmo shell. Por exemplo, inicie o editor de texto GEdit executando geditno terminal e salve um arquivo usando o gedit. Você notará que o arquivo recém-criado é afetado pela mesma configuração umask do terminal.

Caso de uso: sistema multiusuário

Se você estiver em um sistema compartilhado por vários usuários, é desejável que outras pessoas não possam ler arquivos no diretório inicial. Para isso, uma umask é muito útil. Edite ~/.profilee adicione uma nova linha com:

umask 007

Você precisa fazer login novamente para que essa alteração umask entre em ~/.profilevigor. Em seguida, você precisa alterar as permissões de arquivos existentes no diretório inicial, removendo os bits de leitura, gravação e execução para o mundo. Abra um terminal e execute:

chmod -R o-rwx ~

Se você deseja que essa configuração umask seja aplicada a todos os usuários no sistema, você pode editar o arquivo de perfil em todo o sistema em /etc/profile.

ajmitch
fonte
3
Então, o que significam os dígitos no umask? Por que 777significa que o grupo e outros serão capazes de escrever, enquanto 077significa que não podem?
HelloGoodbye 22/01
3
Além disso, você diz que, se o umask for 000, a permissão do arquivo será 777. Portanto, com uma máscara padrão de 022, as permissões de arquivo não deveriam ser 755, ou seja, correspondentes a -rwxr-xr-x, não -rw-r--r--?
HelloGoodbye 22/01
12
Devo admitir que essa explicação me confundiu mais do que me ajudou.
Connel Hooley
8
observe que o umask padrão do Ubuntu mudou para 0002 apenas um mês após a publicação desta resposta.
perfil completo de Jeff Puckett
7
@HelloGoodbye se o umask for 000, nenhuma permissão será removida. aplicativos gostam touche nanocriam arquivos com o padrão, 666para que a permissão do arquivo permaneça, 666mas uma umask 022removerá os bits de gravação para o grupo e outros, então 666é reduzida para 644aka -rw-r--r--Considere mkdiro modo de criação padrão 777com uma umask 022reduz as permissões para755
Jeff Puckett
38

Além da boa discussão na resposta aceita, vale a pena acrescentar mais alguns pontos sobre umask, com referência à forma como ela é gerenciada a partir do 12.04.

Umask e pam_umask

O umask padrão agora está dentro /etc/login.defse não está /etc/profile, como diz a nota oficial /etc/profile:

# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.

Pam_umaské explicado brevemente abaixo e deve-se dizer que o arquivo padrão para o usuário colocar sua configuração personalizada de umask ainda é ~/.profile.

Pam_umaské um dos muitos módulos PAM importantes que são cruciais na operação do Ubuntu (execute apropos '^pam_'para encontrar as páginas de manual dos outros). Na página de manual para pam_umaskobserva-se que

pam_umask é um módulo PAM para definir a máscara de criação de modo de arquivo do ambiente atual. O umask afeta as permissões padrão atribuídas aos arquivos recém-criados.

Uma observação no umask padrão

Novas pastas $HOMEpodem ser criadas mkdircom permissões 775 padrão e arquivos criados com touchpermissões 664 padrão, mesmo quando o umask padrão é 022. Isso parece, a princípio, contraditório e vale a pena explicar.

Enquanto o umask padrão é 022 no Ubuntu, essa não é a história completa, pois existe uma configuração /etc/login.defsque permite que o umask seja 002 para usuários não-root se uma condição for atendida (veja o trecho abaixo). Em uma instalação normal, /etc/login.defscontém a configuração USERGROUPS_ENAB yes. Isso é o que

Permite que a configuração dos bits do grupo umask seja igual aos bits do proprietário (exemplos: 022 -> 002, 077 -> 007) para usuários não raiz, se o uid for o mesmo que gid e o nome de usuário o mesmo que o primário nome do grupo.

Por isso, você vê o seguinte com statquando uma nova pasta é criada mkdirem um sistema de usuário único como o meu (uid e gid são os mesmos):

Access: (0775/drwxrwxr-x)  Uid: ( 1000/username)   Gid: ( 1000/username)

Para obter mais informações, consulte man pam_umaske o Ubuntu manpages online .

Alex
fonte
Parece que sua segunda parte está faltando alguma coisa? (USERGROUP_ENABLE?) +1 para obter informações atualizadas
Lekensteyn
2
@Lekensteyn Estranhamente, a configuração /etc/login.defsé definitivamente USERGROUPS_ENAB yesapós a verificação. A sintaxe desse arquivo é um pouco incomum.
Acabei de verificar o arquivo e a fonte e você está certo, essas (e algumas outras) configurações são denominadas confusamente "_ENAB".
Lekensteyn
33

Isso é bem antigo, mas vale a pena mencionar. Para calcular a umask, diferente das permissões do sistema de arquivos. As umasks octais são calculadas através do AND bit a bit do complemento unário do argumento usando NOT bit a bit. As notações octais são as seguintes:

Octal value : Permission
0 : read, write and execute
1 : read and write
2 : read and execute
3 : read only
4 : write and execute
5 : write only
6 : execute only
7 : no permissions

Em seguida, você pode calcular para definir premissas adequadas para umask, como:

$ umask 077
$ mkdir dir1
$ touch file
$ ls -ld dir1 file

drwx------ 2 amrx amrx 4096 2011-03-04 02:05 dir1
-rw------- 1 amrx amrx    0 2011-03-04 02:05 file

Cálculo da permissão final para arquivos

Você pode simplesmente subtrair o umask das permissões base para determinar a permissão final para o arquivo da seguinte maneira:

666 – 022 = 644
  • Permissões básicas do arquivo: 666
  • valor umask: 022
  • subtraia para obter permissões de novo arquivo (666-022):644 (rw-r–r–)

Cálculo da permissão final para diretórios

Você pode simplesmente subtrair o umask das permissões base para determinar a permissão final para o diretório da seguinte maneira:

777 – 022 = 755
  • Permissões básicas do diretório: 777
  • valor umask: 022
  • Subtraia para obter permissões do novo diretório (777-022):755 (rwxr-xr-x)
amrx
fonte
3
Eu não acho que é assim que as permissões finais são calculadas, e se o valor de desmascarar for 077como você subtrairia 666-077nesse caso?
Sufiyan Ghori
5
A explicação de @SufiyanGhori Baron não está completa para a permissão de arquivos. No seu caso e em qualquer cálculo futuro, para facilitar a lembrança, lembre-se de subtraí-los da seguinte forma: 6-0 6-7 6-7 se algum resultado desses três for -1, então será 0. Então, nós tem resultado final 600
Huy.PhamNhu 28/10
11
@ Huy.PhamNhu Isso também não está correto. Com a permissão básica de 666 e umask de 033, você certamente não obterá 633.
Maaartinus 11/08
7
Não não não. Você não pode usar a subtração para calcular umask (funciona com certos valores, mas não todos). Você precisa pensar no umask como "desativar bits". Veja as outras respostas de Sufiyan e Wisbucky.
wisbucky
33

Outros respondidos explicaram muito bem o conceito de umasking e por que é necessário. Deixe-me adicionar meus dois centavos e dar um exemplo matemático de como as permissões são realmente calculadas.

Antes de tudo, “Máscara” não significa “subtrair”, no sentido aritmético - não há empréstimos ou transferências envolvidos; em segundo lugar, umaské uma máscara; não é um número a ser subtraído.

Terceiro, a máscara desativa os bits de permissão. Se eles já estiverem desativados, a umaskalteração não será feita na permissão,

Por exemplo, suponha que você precise desmascarar 077os padrões do sistema para arquivos 666e diretórios 777.

O comando que você usará é,

umask 077

(desmascarar o valor em binário 000 111 111)

O que esse desmascaramento fará é desativar qualquer um dos seis primeiros LSBs (bits menos significativos) se houver 1e não fará nenhuma alteração se algum deles já estiver desativado.

Aqui está como a permissão final é calculada:

file permisison 666 = 110 110 110 
unmask value    077 = 000 111 111
will result in, 600 = 110 000 000

Observe como os dois 110valores foram alterados para 000.

Similarmente,

directory permission 777 = 111 111 111 
unmask value         077 = 000 111 111
will result in,      700 = 111 000 000
Sufiyan Ghori
fonte
7
essa deve ser a resposta!
Abdelouahab
@SufiyanGhori Então, se umask 177(001 111 111), ele irá desligar primeiros 7 bits menos significativos se eles são1
Kasun Siyambalapitiya
Isso está correto @KasunSiyambalapitiya
Sufiyan Ghori
11
assim é a fórmularesult = file permission & (!umask)
Eric Hodgins
11
@EricHodgins: Sim, exatamente.
Amit Naidu
14

Conceito básico:

Se você é como a maioria dos humanos e não entende o que diabos "umasks octal são calculadas através do AND bit a bit do complemento unário do argumento usando NOT bit a bit" significa, aqui está minha explicação simples:

Antes de tudo, pense no que é uma "máscara". Uma máscara bloqueia alguma coisa. Pense em fita adesiva. Nesse caso, umask é como fita adesiva para bloquear / desativar permissões ao criar um novo arquivo ou diretório.

As permissões padrão ao criar um novo diretório é octal 777 (111 111 111)e um novo arquivo é octal 666 (110 110 110). Definimos o umask para bloquear / desativar determinadas permissões.

  • Um meio de máscara 1para bloquear / desativar essa permissão (coloque fita adesiva sobre esse bit).
  • Um pedaço de máscara 0permitirá a permissão de passagem (sem fita adesiva sobre esse pedaço).

Assim, uma octal 022 (000 010 010)máscara significa desativar group writee others write, e permitir que todas as outras permissões para passar.

Cálculo:

Aqui está um exemplo de cálculo para um novo arquivo (permissão padrão 666) com umask 022:

  perm mask result
----------------------------
u 1    0    1 (pass through)
  1    0    1 (pass through)
  0    0    0 (pass through)
----------------------------
g 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)
----------------------------
o 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)

Então é assim que você acaba com o resultado de 644 quando cria um novo arquivo.

Maneira mais fácil:

Mas se os cálculos de máscara inversa confundem você, existe uma maneira mais fácil de usar a notação simbólica umask. Quando você usa esse método, está apenas especificando os bits de passagem em vez dos bits da máscara.

  • umask u=rwx,g=rx,o=rxmeios permitem passar através de user rwx, group rx, other rx. O que implica desativar group w, others w. Se você executar este comando, verifique umask, você receberá 022.
  • umask u=rwx,g=,o=significa permitir passagem por user rwx. O que implica desativar todo o acesso para groupe others. Se você executar este comando, verifique umask, você receberá 077.

Cálculo de bônus:

Se você realmente deseja entender o que "umasks octal são calculadas através do AND bit a bit do complemento unário do argumento usando NOT bit a bit" significa, aqui estão algumas tabelas lógicas que podem ajudar a demonstrar. Lembre-se, um bit de máscara 1significa desativar, 0significa passar.

perm mask result
----------------
0    1    0     (mask 1 always disables)
1    1    0     (mask 1 always disables)
0    0    0     (mask 0 passes through)
1    0    1     (mask 0 passes through)

Se você preparar a mesa NOT(mask), agora é apenas uma ANDtabela lógica simples !

perm NOT(mask) result
---------------------
0    0         0     (mask 1 always disables)
1    0         0     (mask 1 always disables)
0    1         0     (mask 0 passes through)
1    1         1     (mask 0 passes through)

Portanto, a fórmula para isso é: result = perm AND (NOT mask)

wisbucky
fonte