ทำไม 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.