Por lo que puedo decir, esto está codificado en las utilidades estándar. I strace
D tanto touch
la creación de un nuevo archivo y mkdir
crear un nuevo directorio.
El touch
rastro produjo esto:
open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
mientras que el mkdir
rastro 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 coreutils
paquete 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 umask
de 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 sysopen
en perldoc -f sysopen
)
umask
que conocía era siempre 0022, creando el permiso predeterminado 644.