Theo như tôi có thể nói, điều này được mã hóa cứng thành các tiện ích tiêu chuẩn. Tôi strace
vừa touch
tạo một tệp mới vừa mkdir
tạo thư mục mới.
Dấu touch
vết tạo ra điều này:
open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
trong khi mkdir
dấu vết tạo ra điều này:
mkdir("newdir", 0777) = 0
Thiếu mã hóa quá trình tạo tệp / thư mục trong C, tôi không thấy cách sửa đổi các quyền mặc định. Tuy nhiên, dường như đối với tôi, việc không làm cho các tệp thực thi theo mặc định có ý nghĩa: bạn không muốn bất kỳ văn bản ngẫu nhiên nào vô tình bị hiểu nhầm là các lệnh shell.
Cập nhật
Để cho bạn một ví dụ về cách các bit quyền được mã hóa cứng vào các tiện ích tiêu chuẩn. Dưới đây là một số dòng có liên quan từ hai tệp trong coreutils
gói chứa mã nguồn cho cả hai touch(1)
và mkdir(1)
, trong số các tệp khác:
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;
}
Nói cách khác, nếu chế độ không được chỉ định, hãy đặt nó thành S_IRWXUGO
(đọc: 0777) được sửa đổi bởi umask_value
.
touch.c
thậm chí còn rõ ràng hơn:
int default_permissions =
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
Tất nhiên, đó là cấp quyền đọc và ghi cho mọi người (đọc: 0666), điều này sẽ được sửa đổi theo quy trình umask
tạo tệp, tất nhiên.
Bạn có thể làm được việc này lập trình chỉ: tức là trong khi tạo ra các file từ bên trong hoặc là một chương trình C, nơi bạn thực hiện các cuộc gọi hệ thống trực tiếp hoặc từ bên trong một ngôn ngữ cho phép bạn thực hiện một syscall ở mức độ thấp (xem ví dụ của Perl sysopen
dưới perldoc -f sysopen
).
umask
tôi gặp luôn là 0022, tạo quyền mặc định 644.