Por lo que puedo decir, esto está codificado en las utilidades estándar. I straceD tanto touchla creación de un nuevo archivo y mkdircrear un nuevo directorio.
El touchrastro produjo esto:
open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
mientras que el mkdirrastro produjo esto:
mkdir("newdir", 0777) = 0
A falta de codificar el proceso de creación de archivos / directorios en C, no veo una forma de modificar los permisos predeterminados. Sin embargo, me parece que no tiene sentido hacer que los archivos sean ejecutables de manera predeterminada: no desea que ningún texto aleatorio se interprete erróneamente como comandos de shell.
Actualizar
Para darle un ejemplo de cómo los bits de permiso están codificados en las utilidades estándar. Aquí hay algunas líneas relevantes de dos archivos en el coreutilspaquete que contiene el código fuente para ambos touch(1)y mkdir(1), entre otros:
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;
}
En otras palabras, si no se especifica el modo, configúrelo en S_IRWXUGO(lectura: 0777) modificado por umask_value.
touch.c es aún más claro:
int default_permissions =
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
Es decir, otorgue permisos de lectura y escritura a todos (lectura: 0666), que serán modificados por el proceso umaskde creación de archivos, por supuesto.
Es posible que pueda sortear esto solo mediante programación: es decir, al crear archivos desde un programa en C, donde realiza las llamadas al sistema directamente o desde un lenguaje que le permite realizar una llamada al sistema de bajo nivel (consulte, por ejemplo, Perl sysopenen perldoc -f sysopen)
umaskque conocía era siempre 0022, creando el permiso predeterminado 644.