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+xignora umask, assim comochmod 777, maschmod +waplica 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.)