O umask é a maior parte do quebra-cabeça. Raiz tem uma umask diferente. Isso é bem típico.
A parte do quebra-cabeça que você está perdendo é que o umask é uma máscara . Quando um aplicativo cria um arquivo, ele especifica algumas permissões; o umask é um filtro para essas permissões que remove alguns bits de permissão. O arquivo tem apenas bits de permissão que o aplicativo incluiu. Por exemplo, um aplicativo que pretende criar um arquivo não executável (como touch
) transmite os bits de permissão 666 (em octal); com a umask 002 isso resulta em permissões 664, ou seja, rw-rw-r--: o umask removeu o bit write-other. Ao criar um diretório, o aplicativo (como mkdir
) normalmente permitiria a execução e, portanto, especifica 777 como as permissões; o umask 002 resulta em permissões 775 no diretório, ou seja, rwxrwxr-x.
Você pode ver quais permissões o aplicativo usa observando as chamadas do sistema . Por exemplo:
$ strace -e open,mkdir touch foo
… skipping opening of dynamically linked libraries etc. …
open("foo", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
+++ exited with 0 +++
$ strace -e open,mkdir mkdir goo
… skipping opening of dynamically linked libraries etc. …
mkdir("goo", 0777) = 0
+++ exited with 0 +++