มีวิธีใดที่จะป้องกันการลบไฟล์บางไฟล์จากไดเรกทอรีของผู้ใช้หรือไม่?


42

สมมติว่าผู้ใช้มีDirectory1และมีFile1 File2 CantBeDeletedFile วิธีการทำเช่นนั้นผู้ใช้จะไม่ได้รับอนุญาตให้ลบCantBeDeletedFile ?

หากฉันเปลี่ยนความเป็นเจ้าของDirectory1และลบสิทธิ์การเขียนผู้ใช้จะไม่สามารถลบไฟล์ใด ๆ พวกเขายังไม่สามารถเพิ่มไฟล์ใหม่เป็นต้น

ฉันแค่ต้องการที่จะสามารถตั้งค่าบางไฟล์ที่จะไม่ถูกลบ

คำอธิบายที่เฉพาะเจาะจงมากขึ้น

ฉันกำลังสร้างโปรไฟล์ผู้ใช้ ฉันกำลังสร้างไฟล์เปิดโปรแกรมของพวกเขาในสก์ท็อป ดังนั้นฉันต้องการตั้งค่าตัวเรียกใช้งานไฟล์ (.desktop) และทำให้พวกเขาเพื่อให้ผู้ใช้สามารถเปิดใช้งานได้เท่านั้นและพวกเขาไม่สามารถเปลี่ยนชื่อหรือลบได้เพียงแค่เรียกใช้

ปัจจุบันหากผู้ใช้เป็นเจ้าของไดเรกทอรีซึ่งมีไฟล์ใด ๆ เขาสามารถลบได้

หากไม่มีวิธีทั่วไปสำหรับ * nix ทั้งหมดแสดงว่าเป็น Linux และ ext4 FS

คำตอบ:


40

(ฉันไม่ชอบการบุกรุกบ้านของผู้ใช้ฉันคิดว่าพวกเขาควรได้รับอนุญาตให้ทำสิ่งที่พวกเขาต้องการจะทำกับพวกเขาที่บ้าน ... แต่อย่างไรก็ตาม ... )

สิ่งนี้ควรใช้กับ linux (อย่างน้อย) ฉันถือว่าuserเป็นสมาชิกของกลุ่มuserอยู่แล้ว วิธีแก้ไขคือเปลี่ยนความเป็นเจ้าของDirectory1และตั้งค่า sticky bit ในไดเรกทอรี:

chown root:user Directory1
chmod 1775 Directory1

จากนั้นใช้:

chown root Directory1/CantBeDeletedFile

ตอนนี้userจะไม่สามารถลบไฟล์นี้เนื่องจากบิตเหนียว userยังคงสามารถที่จะเพิ่ม / Directory1ลบไฟล์ของตัวเองใน แต่โปรดสังเกตว่าพวกเขาจะไม่สามารถลบได้Directory1เพราะจะไม่ถูกลบออก

-
1. เมื่อเปิดใช้งานบิตเหนียวในไดเรกทอรีผู้ใช้ (นอกเหนือจากเจ้าของ) สามารถลบไฟล์ของตนเองภายในไดเรกทอรี นี้จะถูกใช้ในไดเรกทอรีเช่น/tmpมีสิทธิ์= 1777rwxrwxrwt


ฉันไม่ชอบเหมือนกัน แต่ผู้ใช้เป็นมือใหม่ในโลก Linux ถ้าพวกเขาลบปล่อยบังเอิญพวกเขาจะเริ่มสแปมการสนับสนุนด้านเทคนิคของเรา :)
bakytn

ขอบคุณมันใช้งานได้! ไม่แน่ใจว่าฉันจะทำอย่างไร ด้วย chattr หรือด้วยวิธีนี้ ถ้าทำในแบบของคุณ ฉันยังคงสามารถลบไดเรกทอรีเป็นรูตได้ ด้วยการแก้ปัญหาบน (chattr) แม้รากไม่สามารถลบโฟลเดอร์
bakytn

@bakytn: นี่เป็นเพียงข้อควรระวังหรือคุณได้รับการสนับสนุนจริงหรือไม่ เพราะมือใหม่ส่วนใหญ่อาจจะกลัวที่จะยุ่งกับไฟล์ที่พวกเขาไม่รู้
Lie Ryan

@Lie Ryan 100% แน่ใจว่าพวกเขาจะขอความช่วยเหลือ แต่ใช่ปัจจุบันมันเป็นเพียงข้อควรระวัง
bakytn

ไม่ช้าก็เร็วต้องฝึกวงล้อหลุด ... และถ้าพวกเขาไม่ได้เรียนรู้ที่จะขี่จักรยานอุบัติเหตุจะเป็นสิ่งที่ควรพิจารณา ผมเห็นด้วยกับคำตอบที่น่าจะเสริม withcopious ความช่วยเหลือเกี่ยวกับเส้นและกระป๋องสแปม "ถ้าคุณ 'บังเอิญ' ลบ ThisDesktopFile แรกไปที่ผนังที่ใกล้ที่สุดและปังหัวของคุณอย่างหนักกับมัน 3 ครั้ง (โชค) แล้วทำcp /here/is/the/master/ThisDesktopFile $HOME. ลงชื่อ : BOfH "
vonbrand

63

ทำให้ไฟล์ไม่เปลี่ยนรูปด้วยiแอตทริบิวต์

chattr +i file.desktop

ดูman chattrข้อมูลเพิ่มเติม


8
ฉันเพิ่มบันทึกย่อนี้เนื่องจากฉันไม่สามารถอนุมานได้จาก man page ที่กล่าวถึง: chattrใช้งานได้กับระบบไฟล์ ext2 / ext3 / ext4 เท่านั้น
จัดการ

มันเจ๋งมาก! มันได้ผล! ขอบคุณมาก! ทางออกที่สวยงาม แต่ข้อ จำกัด หนึ่ง แม้แต่ root ไม่สามารถลบไฟล์เหล่านั้นโดยไม่ทำให้ไฟล์ไม่สามารถแก้ไขได้ แต่นี่มันเจ๋งจริงๆ ไม่แน่ใจว่าจะตอบคำตอบไหน ยอมรับวิธีทั่วไปมากขึ้น แต่ใช้เวลาน้อยลงอย่างรวดเร็ว
bakytn

@ manatwork มันใช้งานได้กับ XFS อย่างน้อยฉันเดาว่าระบบไฟล์อื่น ๆ บางตัวยังรองรับคุณสมบัติเหล่านี้
Ruslan

หากต้องการ 'เลิกทำ' คำสั่งนี้ให้ทำchattr -i file.desktop
GreenRaccoon23

1
ฉันเพิ่งทดสอบสิ่งนี้บน zfs บน linux และมันใช้งานได้ ฉันต้องการป้องกันการลบไฟล์ที่ใช้ในการสั่งให้โปรแกรมสำรองข้อมูลbaculaข้ามโฟลเดอร์
drescherjm

2

ฉันไม่คิดว่าจะมีวิธีการป้องกันการลบไฟล์แต่ละไฟล์ด้วยสิทธิ์ของไฟล์ Unix แต่ฉันสามารถคิดถึงวิธีแก้ปัญหา: เขียน daemon ที่แทนที่เมื่อไฟล์นั้นถูกลบ inotify-toolsสมบูรณ์แบบสำหรับสิ่งนี้หากคุณใช้งานบน Linux

มีหลายวิธีที่คุณสามารถแทนที่รายการที่ถูกลบได้: คัดลอกรายการใหม่หรือเก็บไฟล์จริงไว้ในที่ปลอดภัยและเพียงคัดลอกลิงก์ไปยังไดเรกทอรีของผู้ใช้ สำหรับลิงค์คุณสามารถใช้ symlink หรือฮาร์ดลิงก์ได้ ฉันจะเริ่มต้นด้วย symlink แต่บางโปรแกรม (น้อยมาก) ไม่จัดการ symlink อย่างถูกต้อง หากคุณพบว่าผู้ใช้พบโปรแกรมเช่นนี้ให้ใช้ฮาร์ดลิงก์แทน


0

แบบง่าย ๆ

chmod -i filename

จะ "ป้องกัน" ไฟล์นั้นจากการลบ

rm filename
rm: remove write-protected regular file 'filename'?

คุณยังสามารถลบได้ แต่อย่างน้อยคุณจะต้องแน่ใจเกี่ยวกับสิ่งที่คุณทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.