ทำไม Linux / POSIX ถึงมี lchown แต่ไม่ใช่ lchmod


11

มันดูเหมือนว่าลินุกซ์สนับสนุนการเปลี่ยนเจ้าของเชื่อมโยงสัญลักษณ์ (คือlchown) แต่เปลี่ยนโหมด / ได้รับอนุญาตจากการเชื่อมโยงสัญลักษณ์ (คือlchmod) จะได้รับการสนับสนุน เท่าที่ฉันเห็นนี่เป็นไปตาม POSIX อย่างไรก็ตามฉันไม่เข้าใจว่าทำไมจึงสนับสนุนการดำเนินการอย่างใดอย่างหนึ่งเหล่านี้ แต่ไม่ใช่ทั้งสองอย่าง แรงจูงใจเบื้องหลังสิ่งนี้คืออะไร?


1
สิทธิ์ของ symlink lrwxrwxrwxอยู่เสมอ chmodทำให้รู้สึกไม่ที่นี่ การติดตามลิงก์จะนำคุณไปสู่การอนุญาตเป้าหมาย
— ott--

2
@ott: บนลินุกซ์สิทธิ์ symlink lchmodที่มักจะมีคนที่คุณให้แม่นยำเพราะลินุกซ์ไม่ได้สนับสนุน แต่ Unix อื่น ๆ เช่นระบบปฏิบัติการจะสนับสนุน (เช่นMac OS X ) lchownดังนั้นคำถามคือว่าทำไมลินุกซ์ไม่ได้เมื่อมันไม่สนับสนุน
— Florian Brucker

คำตอบ:


9

Linux เช่นเดียวกับระบบ Unix-like ส่วนใหญ่ (Apple OS / X เป็นหนึ่งในข้อยกเว้นที่หายาก) ละเว้นการอนุญาตใน symlink เมื่อมันมาถึงการแก้ไขเป้าหมายของพวกเขาเช่น

แต่เป็นเจ้าของ symlinks เช่นไฟล์อื่น ๆ ที่มีความเกี่ยวข้องเมื่อมันมาถึงการอนุญาตให้เปลี่ยนชื่อหรือยกเลิกการเชื่อมโยงรายการของพวกเขาในไดเรกทอรีที่มีชุดบิตเช่นt/tmp

เพื่อให้สามารถลบหรือเปลี่ยนชื่อไฟล์ (symlink หรือไม่) ใน/tmpคุณจะต้องเป็นเจ้าของไฟล์ นั่นเป็นเหตุผลหนึ่งที่อาจต้องการเปลี่ยนความเป็นเจ้าของ symlink (เพื่อให้หรือลบสิทธิ์ในการยกเลิกการเชื่อมโยง / เปลี่ยนชื่อ)

$ ln -s / /tmp/x
$ rm /tmp/x
# OK removed

$ ln -s / /tmp/x
$ sudo chown -h nobody /tmp/x
$ rm /tmp/x
rm: cannot remove ‘/tmp/x’: Operation not permitted

นอกจากนี้ดังที่ Mark Plotnick กล่าวไว้ในคำตอบที่ถูกลบตอนนี้แอปพลิเคชั่นการสำรองและเก็บถาวรจำเป็นต้องlchown()เรียกคืน symlink ให้กับเจ้าของดั้งเดิม อีกตัวเลือกหนึ่งคือการสลับ euid และ egid ก่อนสร้าง symlink แต่จะไม่มีประสิทธิภาพและซับซ้อนในการจัดการที่ถูกต้องในไดเรกทอรีที่มีการแยก symlink


ฉันไม่แน่ใจว่านี่เป็นแรงบันดาลใจดั้งเดิมหรือเปล่า แต่มันให้เหตุผลว่าทำไมการออกแบบจึงมีประโยชน์ ขอบคุณ!
— Florian Brucker

0

ไม่มี lchmod () ใน posix แต่ fchmodat () ที่จะอนุญาตให้ตั้งค่าสิทธิ์ของ symlink สิ่งนี้ยังคงไม่ต้องการสิทธิ์ของ symlink ในการประเมิน


1
OP รู้ว่าไม่มีlchmodตาม POSIX คำตอบนี้เพิ่มอะไรที่ไม่ได้อยู่ในคำถาม
— muru

op ถามว่าทำไมมีเพียงหนึ่งฟังก์ชั่นที่รองรับและฉันอธิบายว่าใช้งานได้จริงทั้งคู่ไม่ใช่ภายใต้ชื่อที่กล่าวถึง
— schily

1
งั้นเหรอ มาตรฐานบอกว่า : การใช้งานบางอย่างอาจอนุญาตให้เปลี่ยนโหมดของลิงก์สัญลักษณ์ อินเตอร์เฟสนี้ไม่ได้รับการสนับสนุนในข้อมูลจำเพาะ POSIX ระบบที่มีการสนับสนุนดังกล่าวจะมีอินเตอร์เฟสชื่อ lchmod () เพื่อสนับสนุนการใช้งานดังกล่าว fchmodat () มีพารามิเตอร์ธง ทั้งหมดนี้บอกว่ามีธงสำหรับ fchmodat ที่ช่วยให้การดำเนินการเปลี่ยน symlink perms ไม่ใช่ว่ามันจำเป็น
— muru

ถูกต้องเนื่องจากสิทธิ์ของ symlink ไม่ได้รับการประเมินมานานกว่า 35 ปีจึงไม่มีเหตุผลที่จะเปลี่ยนโหมด Fchmodat () มีอยู่สำหรับ orthogonslity ข้อได้เปรียบที่แท้จริงเพียงอย่างเดียวคือ futimensat () เป็น timestamps ที่ตั้งค่าได้สำหรับ symlinks ช่วยให้มนุษย์เข้าใจโครงสร้างไดเรกทอรี
— schily

@schilly, OS / X ให้เกียรติสิทธิ์ในการเชื่อมโยง ที่นั่นหากคุณไม่มีสิทธิ์ในการอ่านคุณจะไม่สามารถแก้ไขเป้าหมายได้
— Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.