umask vs -m, --mode opções de comando

3

Existe algum mérito técnico / necessidade para numerosos comandos * nix ( mkdir , mkfifo , mknod ) tendo uma opção -m ( --mode )?

Pergunto isso porque, por mais que eu saiba, umask (o comando shell e o syscall) fornecem tudo que você precisa para controlar as permissões de um arquivo:

Por exemplo, posso fazer isso:

mkdir -m 700 "$my_dir"

.. mas também posso fazer com facilidade:

old_umask='umask' \
&& umask 0077 \
&& mkdir "$my_dir"
umask "$old_umask"

Para ser claro, eu posso ver que o primeiro é muito mais amigável e conveniente (especialmente para o uso da linha de comando), mas eu realmente não vejo uma vantagem técnica do antigo sobre o último.

Note também que eu entendo os méritos dessa flexibilidade no nível de syscall subjacente: se eu quiser chamar open ou sem_open ou o que você tem com no máximo 600 permissões, faz sentido que eu passe apenas S_IRUSR | S_IWUSR ao syscall aberto, nunca se preocupe com o umask syscall, salvando um roundtrip do syscall (ou dois, se eu quiser redefinir o umask desde que a chamada umask modifique o umask atual) e meu código seja mais simples /limpador. Isso não se aplica no exemplo de linha de comando porque a opção -m / --mode de tal comando terá para chamar umask para zerar o umask do processo desse comando, para garantir os bits mode / permission que devem ser configurados no novo arquivo / o que estiver definido. (Por exemplo, se ask de meu shell for 022 , então mkdir -m 777 /tmp/foo só funcionará como esperado se estiver chamando umask internamente para zerar o umask herdado do shell.)

Então, o que eu quero ter certeza de que eu não perdi na minha consideração do problema é, existe algo que você não poderia realizar apenas com o comando umask , sem confiar nas opções -m / --mode dos comandos mk *?

    
por mtraceur 09.09.2015 / 05:47

1 resposta

1

Há coisas que você não pode fazer com umask sozinho:

  • crie um arquivo regular com permissões acima de 0666 .

  • crie um diretório com permissons acima de 0777 .

Você também precisa do chmod ou --mode . Se, por motivos de segurança, você nunca quiser criar um objeto com direitos temporariamente mais altos do que o pretendido, chmod sem umask também não é o suficiente. Em alguns casos, você precisa usar ambos, resultando na sequência feia umask / mkdir / chmod / umask . (Exemplo: crie um diretório temp de grupo ( 01770 ).)

Portanto, --mode pode ser substituído por chmod e umask , mas não com apenas um deles.

    
por 09.09.2015 / 08:07