Até onde eu sei, isso é codificado em utilitários padrão. I strace
d tanto a touch
criação de um novo arquivo e uma mkdir
criação de um novo diretório.
O touch
rastreio produziu isso:
open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
enquanto o mkdir
rastreio produziu isso:
mkdir("newdir", 0777) = 0
Além de codificar o processo de criação de arquivos / diretórios em C, não vejo uma maneira de modificar as permissões padrão. Parece-me, no entanto, que não tornar os arquivos executáveis por padrão faz sentido: você não deseja que nenhum texto aleatório seja acidentalmente mal interpretado como comandos do shell.
Atualizar
Para dar um exemplo de como os bits de permissão são codificados nos utilitários padrão. Aqui estão algumas linhas relevantes de dois arquivos no coreutils
pacote que contém o código-fonte para ambos touch(1)
e mkdir(1)
, entre outros:
mkdir.c
:
if (specified_mode)
{
struct mode_change *change = mode_compile (specified_mode);
if (!change)
error (EXIT_FAILURE, 0, _("invalid mode %s"),
quote (specified_mode));
options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
&options.mode_bits);
free (change);
}
else
options.mode = S_IRWXUGO & ~umask_value;
}
Em outras palavras, se o modo não for especificado, configure-o para S_IRWXUGO
(leia-se: 0777) modificado pelo umask_value
.
touch.c
é ainda mais claro:
int default_permissions =
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
Ou seja, conceda permissões de leitura e gravação a todos (leia-se: 0666), que serão modificados pelo processo umask
de criação do arquivo, é claro.
Você pode contornar isso programaticamente apenas: por exemplo, ao criar arquivos a partir de um programa C, em que você faz chamadas do sistema diretamente ou de um idioma que permite fazer uma chamada syscall de baixo nível (veja, por exemplo, Perl sysopen
em perldoc -f sysopen
)
umask
que eu conheci sempre foi 0022, criando permissão padrão 644.