วิธีการลบไดเรกทอรีที่ไม่ว่างเปล่าซึ่งผู้ใช้ไม่ได้เป็นเจ้าของใน Linux?


10

หากไดเร็กทอรี "foo" เป็นของผู้ใช้ A และมีไดเร็กทอรี "bar" ซึ่งเป็นของ root ผู้ใช้ A สามารถลบออกด้วยrmdirซึ่งเป็นเหตุผลเนื่องจาก "foo" สามารถเขียนได้โดยผู้ใช้ A

แต่ถ้าไดเรกทอรี "บาร์" มีไฟล์ที่เป็นเจ้าของรูทอื่นไม่สามารถลบไดเรกทอรีได้เพราะไฟล์ในนั้นจะต้องถูกลบออกก่อนดังนั้นจึงกลายเป็นไฟล์ว่างเปล่า แต่ "bar" เองนั้นไม่สามารถเขียนได้ดังนั้นจึงไม่สามารถลบไฟล์ในนั้นได้

มีวิธีแก้ไขไหม? หรือโน้มน้าวให้ฉันเป็นอย่างอื่นว่าทำไมมันถึงจำเป็น

คำตอบ:


7

การตีความที่ 1: ไดเรกทอรีเป็นพื้นที่ย่อยของระบบไฟล์ สามารถแบ่งย่อยออกเป็นส่วนย่อยได้อีกด้วยการสร้างไดเรกทอรีย่อยในนั้น เจ้าของไดเรกทอรีfooควรมีการควบคุมทุกอย่างภายในสเปซ: foo/bar, foo/bar/quxฯลฯ

การตีความที่ 2: ไดเรกทอรีเป็นพื้นที่ย่อยของระบบไฟล์ ทุกไดเร็กทอรีถูกแนบกับไดเร็กทอรีอื่นบางตัวซึ่งเรียกว่าพาเรนต์ เจ้าของไดเรกทอรีfooมีการควบคุมทุกอย่างภายในพื้นที่ย่อย อย่างไรก็ตามสำหรับไดเรกทอรีย่อยfoo/barเจ้าของfooมีสิทธิ์ควบคุมว่าbarสามารถแนบกับหรือfooไม่มากกว่าสิ่งที่อยู่ภายในbar: เฉพาะเจ้าของเท่านั้นที่barสามารถควบคุมได้

หลักฐานสนับสนุนการตีความที่ 2: ดังที่คุณได้บันทึกไว้วิธีการอนุญาตทำงาน นอกจากนี้ความจริงที่ว่าระบบไฟล์ Unix บางระบบอนุญาตให้มีการแนบไดเรกตอรีมากกว่าหนึ่งพาเรนต์ซึ่งเรียกว่ามีฮาร์ดลิงก์หลายตัว (การมีฮาร์ดลิงก์หลายตัวเป็นเรื่องปกติสำหรับไฟล์ปกติ แต่มักจะหมดกำลังใจหรือถูกห้ามสำหรับไดเรกทอรีส่วนใหญ่เนื่องจากมีความเสี่ยงในการสร้างลูปโดยที่ไดเรกทอรีนั้นถูกลบปู่ย่าตายายของตัวเองออก N - ดังนั้นคุณจึงไม่สามารถเข้าถึงได้จากราก ไดเรกทอรีซึ่งเป็นความคาดหวังที่พบบ่อยมากนอกจากนี้ยังมีปัญหาว่าจะทำอย่างไรหากไดเรกทอรีมีฮาร์ดลิงก์ 0 รายการ แต่ไม่ว่างเปล่า: เนื่องจากไดเรกทอรีไม่มีการเชื่อมต่อคุณต้องการลบ แต่สิ่งที่คุณทำกับมัน เนื้อหา?)

หลักฐานสนับสนุนการตีความที่ 1: ในทางปฏิบัติไดเรกทอรีมีผู้ปกครองคนเดียวและเป็นโครงสร้างของต้นไม้ และคุณไม่สามารถเข้าถึงได้foo/bar/quxเว้นแต่คุณจะได้รับอนุญาตให้ดำเนินการfooเช่นเดียวกับbar(ดียกเว้นว่ามีวิธีการที่ค่อนข้างชัดเจนในการให้เข้าถึงbarโดยไม่ได้รับอนุญาตให้เข้าถึงfoo) ดังนั้นระดับที่สูงขึ้นจึงมีความสำคัญ

ในบันทึกที่เป็นประโยชน์มากขึ้นในสถานการณ์ของคุณผู้ใช้ A สามารถทำได้

mkdir ขยะ
mv foo / บาร์ขยะ /
rmdir foo

1
นี่เป็นคำตอบที่ยอดเยี่ยม (rec'ed) แต่ความไม่สอดคล้องที่เห็นได้ชัดยังคงน่าผิดหวังสำหรับฉัน และในขณะที่ตัวอย่างจริง ๆ ของการย้ายบาร์ไปยังถังขยะก็ใช้งานได้เรายังเหลือไดเรกทอรีที่เรียกว่าขยะที่ไม่สามารถลบได้ ฉันมีปัญหาเดียวกันนี้ยกเว้นว่าเป็นผู้ใช้ A และผู้ใช้ B ที่ B ติดอะไรบางอย่างในไดเรกทอรีที่เป็นเจ้าของโดย A ซึ่ง A ต้องการลบ
พอลฮูเปอร์

นี่เป็นคำอธิบายที่ดี แต่ตัวอย่างในตอนท้ายที่ใช้mvเพื่อหลีกเลี่ยงปัญหาไม่ได้ผลสำหรับฉันใน Raspbian (ยังไม่ได้ลองระบบอื่นใดเลย) นอกจากนี้เมื่อทำการวิจัยปัญหานี้ฉันไม่ได้เห็นการใช้mvเป็นวิธีการแก้ปัญหาที่กล่าวถึงที่อื่น อันที่จริงตามความเข้าใจของฉันเกี่ยวกับวิธีการทำงานของสิทธิ์มันทำให้รู้สึกว่าmvล้มเหลวเมื่อฉันพยายาม ฉันพลาดอะไรไปรึเปล่า? หรือฟังก์ชั่นนี้อาจมีการเปลี่ยนแปลงหรือไม่? @Gilles @PaulHooper
fvgs

@fvgs ไม่มีอะไรเปลี่ยนแปลง แต่สถานการณ์ของคุณอาจมีการอนุญาตที่แตกต่างจากอันนี้ ฉันขอแนะนำให้คุณถามคำถามใหม่ (บนUnix & Linuxแทนที่จะเป็นServer Faultเนื่องจากคำถามนี้อาจถูกพิจารณานอกหัวข้อหากมีการถามใน SF ตอนนี้) และให้รายละเอียดทั้งหมดเกี่ยวกับสถานการณ์ของคุณ
Gilles 'หยุดความชั่วร้าย'

@Gilles คุณช่วยชี้ให้ฉันดูเอกสารอ้างอิงหรือพูดถึงพฤติกรรมที่คุณอธิบายไว้ได้mvไหม? ฉันสามารถใช้mvเพื่อเปลี่ยนชื่อไดเรกทอรีบาร์ หมายความว่าmvสำเร็จตราบเท่าที่ฉันไม่พยายามย้ายแถบนอกไดเรกทอรีปัจจุบันหรือไปยังไดเรกทอรีอื่น ๆ แต่ตัวอย่างที่คุณให้ (ซึ่งย้ายแถบไดเรกทอรี) ไม่ทำงานสำหรับฉัน (ปฏิเสธสิทธิ์) ตัวอย่างที่คุณให้มาถือว่ามีเงื่อนไขเฉพาะนอกเหนือจากที่ระบุในคำถามหรือไม่
fvgs

@fvgs ตัวอย่างของฉันไม่ได้ย้ายbarไดเรกทอรีมันจะย้ายไปยังไดเรกทอรีที่คุณเป็นเจ้าของ garbageสามารถอยู่ที่ใดก็ได้ในระบบไฟล์เดียวกันไม่จำเป็นต้องเป็นพี่น้องfooกัน
Gilles 'หยุดความชั่วร้าย' ใน

0

วิธีเดียวที่จะแก้ปัญหานี้คือการใช้ setgid หรือ setuid ในไดเรกทอรีหลักหรือใช้ ACL

ตั้งไดเรกทอรี setgid ด้วย

chmod g+s foo

ตั้งค่า ACL เริ่มต้นด้วย

setfacl -d -R -m g:group:rwx foo

ชุดนี้มันเป็น ACL เริ่มต้นบนเส้นทางนี้ คุณต้องเมานต์ระบบไฟล์ที่มีพา ธ นี้ด้วยตัวเลือก acl!

บอกฉันทีว่าทำไมคุณคิดว่าคุณต้องการสิ่งนี้


ปัญหาก็คือหนึ่งในความมั่นคง ไม่มีอะไรทำให้ฉันไม่สามารถลบไฟล์หรือไดเรกทอรีว่างเปล่าที่ผู้ใช้รายอื่นเป็นเจ้าของในไดเรกทอรีที่ฉันเป็นเจ้าของ แต่ถ้ามันไม่ว่างเปล่าฉันจะถูกล็อคไม่ให้ลบไดเรกทอรีของตัวเอง
Alex B

หากเป็นกรณีนี้ฉันจะใช้หนึ่งในตัวเลือกที่ฉันให้ไว้ พวกเขาจะทำงานได้ดีสำหรับคุณ
wzzrd

ฉันมักจะใช้หลายบัญชีบนเดสก์ท็อปของฉัน (หนึ่งในนั้นคือบัญชี "หลักที่ไม่ใช่ราก") ฉันสามารถรับสถานการณ์เช่นนี้ได้เมื่อmake installเริ่มต้นจากรูทเริ่มสร้างบางอย่าง
วิ

setgid ในไดเรกทอรีแม่ไม่ได้ช่วย หลังจากทำตามรากcd ~user && mkdir qqq && touch qqq/qqqผมไม่สามารถกำจัด QQQ จากผู้ใช้โดยการและchmod g+s . rm -Rf qqq
วิ

MMH นั่นอาจเป็นเรื่อง umask แล้ว หากไดเรกทอรีของคุณคือ 775 มันเป็น setgid และ umask ของคุณคือ 0002 ไฟล์นั้นจะสามารถเขียนได้สำหรับกลุ่มและสามารถถอดออกได้ แต่จริงมันไม่ทำงานกับ umask 0022 (ซึ่งส่วนใหญ่เป็นค่าเริ่มต้น) ควรจะบอกว่า คุณทดสอบตัวเลือก acl แล้วหรือยัง?
wzzrd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.