Насколько я могу судить, это жестко запрограммировано в стандартные утилиты. Я strace
d одновременно 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 sysopen
Under perldoc -f sysopen
).
umask
с