O ile wiem, jest to na stałe zapisane w standardowych narzędziach. Mogę utworzyć stracezarówno touchnowy plik, jak i mkdirnowy katalog.
touchŚlad produkowane w ten sposób:
open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
podczas gdy mkdirślad dał to:
mkdir("newdir", 0777) = 0
Poza kodowaniem procesu tworzenia pliku / katalogu w C, nie widzę sposobu modyfikowania domyślnych uprawnień. Wydaje mi się jednak, że brak domyślnego wykonywania plików ma sens: nie chcesz, aby przypadkowy tekst był przypadkowo błędnie interpretowany jako polecenie powłoki.
Aktualizacja
Aby dać przykład, w jaki sposób bity uprawnień są na stałe zakodowane w standardowych narzędziach. Oto kilka odpowiednich wierszy z dwóch plików w coreutilspakiecie, który zawiera kod źródłowy zarówno dla, jak touch(1)i mkdir(1)między innymi:
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;
}
Innymi słowy, jeśli tryb nie jest określony, ustaw go na S_IRWXUGO(odczyt: 0777) zmodyfikowany przez umask_value.
touch.c jest jeszcze jaśniejszy:
int default_permissions =
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
To znaczy, daj wszystkim uprawnienia do odczytu i zapisu (odczyt: 0666), które umaskoczywiście zostaną zmodyfikowane przez proces tworzenia pliku.
Możesz być w stanie obejść ten problem tylko programowo: tj. Podczas tworzenia plików z poziomu programu C, w którym wywołujesz system bezpośrednio lub z poziomu języka, który pozwala na wywołanie syscall niskiego poziomu (patrz na przykład Perl sysopenpod perldoc -f sysopen).
umaskco spotkałem, to zawsze 0022, tworząc domyślne uprawnienie 644.