คำตอบของ baraboom และ peth นั้นถูกต้องทั้งสอง: บิตการอนุญาตในลิงก์สัญลักษณ์นั้นไม่เกี่ยวข้อง (ยกเว้นใน macOS; ดูด้านล่าง) และการเปลี่ยนการอนุญาตบนลิงก์สัญลักษณ์ - โดยchmod
เครื่องมือบรรทัดคำสั่งหรือโดยการchmod()
เรียกระบบ - เพียงแค่ทำหน้าที่เป็น หากมีการดำเนินการกับเป้าหมายของลิงก์สัญลักษณ์
หากต้องการอ้างอิงคำอธิบาย SUSv4 / POSIX.1-2008 ของการเรียกระบบ symlink () :
ค่าของบิตโหมดไฟล์สำหรับลิงก์สัญลักษณ์ที่สร้างขึ้นไม่ได้ระบุไว้ อินเตอร์เฟสทั้งหมดที่ระบุโดย POSIX.1-2008 จะทำงานเสมือนว่าเนื้อหาของลิงก์สัญลักษณ์สามารถอ่านได้เสมอยกเว้นค่าบิตบิตโหมดไฟล์ที่ส่งคืนในฟิลด์st_modeของโครงสร้างstatนั้นไม่ได้ระบุไว้
ที่นี่“ ไม่ระบุ” ออกจากห้องของการตีความสำหรับการใช้งานแต่ละครั้ง ข้อมูลจำเพาะ:
- บน Linux (ทดสอบโดยใช้ ext4fs)
stat()
ผลตอบแทนst_mode=0777
ไม่ว่า umask จะเป็นอย่างไรเมื่อสร้าง symlink ขึ้นมา ls -l
ดังนั้นจะแสดงlrwxrwxrwx
ลิงก์สัญลักษณ์เสมอ
- บน MacOS (HFS) และ FreeBSD (ทั้ง UFS และ ZFS) การเชื่อมโยงสัญลักษณ์ไม่ได้รับอนุญาตของตัวเอง: ใน
chmod -h
คำสั่งระบุไว้ข้างต้นสามารถเปลี่ยนแปลงได้รับอนุญาตการเชื่อมโยงนี้ (ซึ่งภายในใช้ที่ไม่ใช่ POSIX lchown()
เรียกระบบเพื่อให้บรรลุนี้) และstat()
ระบบ st_mode
เรียกผลตอบแทนที่คุ้มค่านี้
ลิงก์สัญลักษณ์บน Linux และ FreeBSD สามารถติดตามได้ตามที่ระบุโดย POSIX โดยเฉพาะอย่างยิ่งใน FreeBSD หมายความว่าโหมดไฟล์ของลิงก์สัญลักษณ์ไม่มีผลกระทบใด ๆ ต่อการควบคุมการเข้าถึง
ในทางกลับกัน macOS แบ่ง POSIX เล็กน้อย แม้ว่าลิงก์สัญลักษณ์สามารถติดตามได้โดยไม่คำนึงถึงสิทธิ์การอ่าน แต่readlink()
ล้มเหลวด้วยEACCES
(ปฏิเสธสิทธิ์) หากผู้ใช้ไม่มีสิทธิ์อ่าน:
$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r-- 1 root staff 1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink
ls: symlink: Permission denied
l--------- 1 root staff 1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye
(โปรดทราบว่า-> target
ส่วนที่ขาดหายไปในผลลัพธ์จากls -l
คำสั่งที่สองและcat symlink
ยังคงประสบความสำเร็จและพิมพ์เนื้อหาของtarget
ไฟล์แม้ว่าผู้ใช้จะไม่ได้รับอนุญาตให้อ่านsymlink
)
เห็นได้ชัดว่า NetBSD เสนอตัวเลือกการเมาท์แบบพิเศษsymperm
ซึ่งตั้งค่าไว้ซึ่งทำให้การเชื่อมโยงสัญลักษณ์อ่าน / เรียกใช้สิทธิ์ในการควบคุมreadlink()
และการสำรวจเส้นทาง