เท่าที่ฉันสามารถบอกได้นี่เป็นฮาร์ดโค้ดลงในโปรแกรมอรรถประโยชน์มาตรฐาน ฉันstrace
ทั้งการ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 ซึ่งคุณสามารถโทรออกจากระบบโดยตรงหรือจากภายในภาษาที่ให้คุณสร้าง syscall ระดับต่ำ (ดูตัวอย่างของ Perl sysopen
ใต้perldoc -f sysopen
)
umask
ฉันพบคือ 0022 เสมอสร้างการอนุญาตเริ่มต้น 644