Насколько я могу судить, это жестко запрограммировано в стандартные утилиты. Я straced одновременно touchсоздать новый файл и mkdirсоздать новый каталог.
touchСледа производится следующим образом :
open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
в то время как mkdirслед произвел это:
mkdir("newdir", 0777) = 0
Если не считать кодирование процесса создания файла / каталога в C, я не вижу способа изменить разрешения по умолчанию. Однако мне кажется, что не делать файлы исполняемыми по умолчанию имеет смысл: вы не хотите, чтобы какой-либо случайный текст был случайно неверно истолкован как команды оболочки.
Обновить
Чтобы дать вам пример того, как биты разрешений жестко закодированы в стандартные утилиты. Вот некоторые соответствующие строки из двух файлов в coreutilsпакете, который содержит исходный код для обоих touch(1)и mkdir(1), среди прочего:
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;
}
Другими словами, если режим не указан, установите для него значение S_IRWXUGO(читай: 0777), измененное параметром umask_value.
touch.c еще понятнее
int default_permissions =
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
То есть дать каждому право на чтение и запись (читай: 0666), что umask, конечно , будет изменено процессом создания файла.
Вы можете быть в состоянии обойти это программно только: то есть при создании файлов из любой программы C, где вы делаете системные вызовы напрямую или из языка , что позволяет сделать низкоуровневый системный вызов (смотрите, например , в Perl sysopenUnder perldoc -f sysopen).
umaskс