ทำไม rm สามารถลบไฟล์แบบอ่านอย่างเดียวได้?


91

หากฉันสร้างไฟล์แล้วเปลี่ยนการอนุญาตเป็น444(อ่านอย่างเดียว) จะrmสามารถลบไฟล์ได้อย่างไร

ถ้าฉันทำสิ่งนี้:

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rmจะถามว่าฉันต้องการลบไฟล์ที่ป้องกันการเขียนหรือtest.txtไม่ ฉันคาดว่าrmจะไม่สามารถลบไฟล์ดังกล่าวและฉันจะต้องทำchmod +w test.txtก่อน ถ้าฉันทำrm -f test.txtแล้วrmจะลบไฟล์โดยไม่ต้องถามแม้ว่าจะเป็นแบบอ่านอย่างเดียว

ทุกคนสามารถอธิบายได้หรือไม่ ฉันใช้ Ubuntu 12.04 / bash


ชี้แจง: ฉันใช้คำสั่งเหล่านี้ในฐานะผู้ใช้ปกติไม่ใช่ในฐานะรูท
แมกนัส

คำตอบ:


104

rmความต้องการทั้งหมดคือสิทธิ์ในการเขียน + ดำเนินการในไดเรกทอรีหลัก การอนุญาตของไฟล์เองไม่เกี่ยวข้อง

นี่คือข้อมูลอ้างอิงที่อธิบายรูปแบบการอนุญาตให้ชัดเจนยิ่งกว่าที่ฉันเคยทำได้:

ความพยายามใด ๆ ในการเข้าถึงข้อมูลของไฟล์ต้องได้รับอนุญาตการอ่าน ความพยายามใด ๆ ในการแก้ไขข้อมูลของไฟล์ต้องได้รับอนุญาตในการเขียน ความพยายามใด ๆ ในการเรียกใช้ไฟล์ (โปรแกรมหรือสคริปต์) ต้องมีการอนุญาตให้ใช้งาน ...

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

จำเป็นต้องใช้สิทธิ์ดำเนินการในไดเรกทอรีเพื่อให้สามารถเข้าไปในซีดีได้ (นั่นคือเพื่อทำให้ไดเรกทอรีบางส่วนเป็นไดเรกทอรีทำงานปัจจุบันของคุณ)

จำเป็นต้องใช้งาน Execute ในไดเรกทอรีเพื่อเข้าถึงข้อมูล "inode" ของไฟล์ภายใน คุณต้องการสิ่งนี้เพื่อค้นหาไดเรกทอรีเพื่ออ่าน inodes ของไฟล์ภายใน ด้วยเหตุนี้สิทธิ์ดำเนินการในไดเรกทอรีจึงมักเรียกว่าสิทธิ์ในการค้นหาแทน


2
ดังนั้นถ้าฉันต้องการสร้างไดเรกทอรีที่ไฟล์บางไฟล์ไม่สามารถลบ / เปลี่ยนแปลงโดยไม่ทำ chmod ก่อน แต่คนอื่นสามารถเขียนได้อย่างอิสระนั่นจะเป็นไปไม่ได้เหรอ? ฉันจะต้อง chmod ไดเรกทอรี 555 ซึ่งจะหมายความว่าไม่มีไฟล์ในไดเรกทอรีที่สามารถสร้างหรือแก้ไข
แมกนัส

3
@ Magnagnus - แน่นอนว่าไม่มีอะไรหยุดคุณสร้างไดเรกทอรีลูกที่เขียนได้ภายในไดเรกทอรีอ่านอย่างเดียวและเก็บแฟ้มที่เขียนได้ของคุณไว้ ไม่สามารถลบไดเรกทอรีลูกเองได้ แต่เนื้อหาสามารถ
ire_and_curses

7
คุณไม่สามารถสร้างไดเรกทอรีที่เหนียวแน่น+tเพื่อให้ผู้คนไม่สามารถแก้ไขหรือลบไฟล์ในไดเรกทอรีนั้นที่พวกเขาไม่ได้เป็นเจ้าของแม้ว่าพวกเขาจะมีสิทธิ์ในการเขียนไปยังไดเรกทอรีหรือไม่
Shadur

3
@Magnus หากคุณมีการเข้าถึงรูท (รวมถึง sudo) คุณสามารถใช้chattrเพื่อเพิ่มการตั้งค่าสถานะที่ไม่เปลี่ยนรูปแบบให้กับไฟล์ ถ้าไม่เช่นนั้น ire_and_curses ค่อนข้างถูกต้อง
James O'Gorman

6
ไม่ได้ใช้ rm -f เพียง แต่ทำงานได้ตราบใดที่ฉันไม่ได้สติ ... บวกฉันไม่รู้ว่าสคริปต์ทุบตีปัญญาอ่อนที่ฉันเขียนอาจจะทำหรือไม่ทำก็ได้
Magnus

53

ตกลงตามความคิดเห็นของคุณถึง ire_and_curses สิ่งที่คุณต้องการทำจริงๆคือทำให้บางไฟล์ไม่เปลี่ยนรูป คุณสามารถทำได้ด้วยchattrคำสั่ง ตัวอย่างเช่น:

เช่น

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

คุณไม่สามารถทำอะไรกับไฟล์ที่ไม่เปลี่ยนรูปแบบได้ - คุณไม่สามารถลบแก้ไขเขียนทับเปลี่ยนชื่อเปลี่ยนชื่อ chmod หรือ chown หรืออื่น ๆ ได้ สิ่งเดียวที่คุณสามารถทำได้คืออ่าน (ถ้าอนุญาตยูนิกซ์อนุญาต) และ (เป็น root) chattr -iเพื่อลบบิตที่ไม่เปลี่ยนรูป

ระบบไฟล์บางระบบอาจไม่รองรับคุณสมบัติทั้งหมด AFAIK ไม่เปลี่ยนรูปได้รับการสนับสนุนโดยระบบไฟล์ linux ทั่วไปทั้งหมด (รวมถึง ext2 / 3/4 และ xfs. zfsonlinux ไม่รองรับคุณสมบัติในขณะนี้)


3
มันมีประโยชน์เป็นครั้งคราว btw ไม่ใช่รูทแม้แต่สามารถแก้ไขหรือลบไฟล์ที่ไม่เปลี่ยนรูปได้ btw ยังใช้lsattrเพื่อแสดงรายการคุณสมบัติ
cas

2
+1 - ฉันลืมเกี่ยวกับคุณลักษณะและยุ่งมากกับการตอบคำถามตามตัวอักษรเกี่ยวกับrmสิ่งนี้ที่ไม่เคยเกิดขึ้นกับฉัน ...
ire_and_curses

2
นี่เป็นระบบไฟล์ที่เฉพาะเจาะจงและอาจทำให้คุณมีปัญหามากขึ้นในการแก้ปัญหา
Stéphane Gimenez

4
@Magnus: ปัญหาที่เป็นไปได้รวมถึงการสำรองข้อมูล (ไม่ทุกอรรถประโยชน์การสำรองข้อมูลจะสำรองคุณลักษณะ - ในความเป็นจริงส่วนใหญ่จะไม่) และกู้คืน (ถ้าคุณเรียกคืนไปยังไดเรกทอรีที่มีไฟล์ที่ไม่เปลี่ยนรูปแล้วบางโปรแกรมจะถือว่าไม่สามารถ เป็นข้อผิดพลาดร้ายแรงและยกเลิก) นอกจากนี้คุณสามารถทำให้ตัวเองสับสนหากคุณลืมว่าคุณสร้างไฟล์ที่ไม่เปลี่ยนรูปและไม่สามารถลบได้ว่าทำไมคุณไม่สามารถลบมันได้ ... ข้อความแสดงข้อผิดพลาด 'Operation not allow' เป็นข้อความแสดงข้อผิดพลาดเดียวกันกับที่คุณเห็นกับระบบไฟล์บางประเภท การคอร์รัปชั่นซึ่งอาจนำไปสู่การเกิดปฏิกิริยาที่อาจเป็นอันตราย
cas

1
คุณสามารถคัดลอก (cp) ไฟล์ที่ไม่เปลี่ยนรูป
Octopus

0

หนึ่งคำตอบสำหรับคำถามนี้อ้างว่าคุณสามารถลบไฟล์ออกจากไดเรกทอรีเฉพาะเมื่อมันได้writeรับอนุญาตเท่านั้นที่ผิดทั้งหมด! แค่ลองดู! ให้writeสิทธิ์ไดเรกทอรีและลองลบคุณทำไม่ได้!
ในการลบไฟล์ในไดเรกทอรีที่คุณต้องการwriteและexecuteได้รับอนุญาตในไดเรกทอรี

ตอนนี้กลับไปที่คำถาม: การลบไฟล์โดยใช้rmคุณเพียงแค่ลบข้อมูล inode ออกจากไดเรกทอรีเช่นคุณไม่ได้อยู่ในshreddingดิสก์ หากข้อมูล inode ของไฟล์ไม่อยู่ในไดเรกทอรีคุณจะไม่สามารถเข้าถึงได้ (เช่นกันเพราะคุณไม่สามารถดูได้เนื่องจากไม่ได้อยู่ในรายการโดยไดเรกทอรีหลัก) เช่นจะถูกลบออกสำหรับคุณ
ดังนั้นการลบไฟล์จากไดเรกทอรีทั้งหมดที่คุณได้รับอนุญาตในไดเรกทอรี; การอนุญาตในไฟล์นั้นไม่เกี่ยวข้อง

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