umask é subtrativo, não prescritivo: bits de permissão definidos em umask são removidos por padrão dos modos especificados por programas, mas umask não pode adicionar bits de permissão. touch
especifica o modo 666 por padrão (o link é para a implementação do GNU, mas outros se comportam da mesma maneira, isto é especificado por POSIX ), então o arquivo resultante termina com o mascarado pelo atual umask
: no seu caso, como umask
não mascara nada, o resultado é 666.
O modo de um arquivo ou diretório é geralmente especificado pelo programa que o cria; a maioria das chamadas de sistema envolvidas tem um modo ( por exemplo open(2)
, creat(2)
, mkdir(2)
todos têm um parâmetro mode, mas fopen(2)
não usa o modo 666). A menos que o diretório pai especifique uma ACL padrão, a umask do processo no momento da chamada é usada para mascarar o modo especificado (bit a bit mode & ~umask
; efetivamente isso subtrai cada conjunto de permissões em umask do modo), portanto o umask só pode reduzir um modo, não pode aumentá-lo. Se o diretório pai especificar uma ACL padrão, isso é usado em vez do umask: as permissões de arquivo resultantes são a interseção do modo especificado pelo programa de criação e o especificado pela ACL padrão.
POSIX especifica que o modo padrão deve ser 666 para arquivos, 777 para diretórios ; mas isso é apenas um padrão documentação ( ie , ao ler POSIX, se um programa ou função não especificar um modo de arquivo ou diretório, o padrão se aplica), e é não imposta pelo sistema. De um modo geral, isto significa que as ferramentas compatíveis com POSIX especificam o modo 666 ao criar um arquivo, e o modo 777 ao criar um diretório, e o umask é subtraído daquele; mas o sistema não pode impor isso, porque há muitos motivos legítimos para usar outros modos e / ou ignorar umask:
- compiladores que criam um executável tentam produzir um arquivo com o conjunto de bits executáveis (eles aplicam umask embora);
-
chmod(1)
obviamente especifica o modo dependendo de seus parâmetros, e ignora umask quando "quem" é especificado ou o modo é totalmente especificado (por isso,chmod o+x
ignora umask, assim comochmod 777
, maschmod +w
aplica umask); - ferramentas que preservam as permissões aplicam o modo apropriado e ignoram umask: por exemplo
cp -p
,tar -p
; - ferramentas que levam um parâmetro especificando totalmente o modo também ignoram umask:
install --mode
,mknod -m
...
Portanto, você deve pensar em umask como especificando os bits de permissão que você não deseja ver definidos por padrão, mas esteja ciente de que isso é apenas uma solicitação. Você não pode usá-lo para especificar os bits de permissão que deseja ver definidos, apenas aqueles que você deseja ver não definidos. Além disso, qualquer processo pode alterar sua umask de qualquer maneira, usando a umask(2)
chamada do sistema! A chamada do sistema umask(2)
também é a única forma definida pelo POSIX para um processo descobrir sua umask atual (herdada de seu pai). No Linux, começando com o kernel 4.7, você pode ver umask atual de um processo por procurando por Umask
em /proc/${pid}/status
.
(Para completar, eu mencionarei que o comportamento em relação a setuid
, setgid
e sticky bits é dependente do sistema, e sistemas de arquivos remotos como o NFS podem adicionar suas próprias reviravoltas.)