เท่าที่ฉันสามารถบอกได้นี่เป็นฮาร์ดโค้ดลงในโปรแกรมอรรถประโยชน์มาตรฐาน ฉัน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