Tại sao rm có thể loại bỏ các tập tin chỉ đọc?


91

Nếu tôi tạo một tệp và sau đó thay đổi quyền của nó thành 444(chỉ đọc), làm thế nào rmđể loại bỏ nó?

Nếu tôi làm điều này:

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

... rmsẽ hỏi tôi có muốn xóa tệp được bảo vệ chống ghi không test.txt. Tôi đã dự kiến ​​rằng rmkhông thể loại bỏ một tập tin như vậy và tôi sẽ phải làm một chmod +w test.txtđầu tiên. Nếu tôi làm rm -f test.txtthì rmsẽ xóa tệp mà không cần hỏi, mặc dù nó chỉ đọc.

Bất cứ ai có thể làm rõ? Tôi đang sử dụng Ubuntu 12.04 / bash.


Làm rõ: Tôi đang chạy các lệnh này với tư cách là người dùng thông thường, không phải là root.
Magnus

Câu trả lời:


104

Tất cả các rmnhu cầu là ghi + thực thi quyền trên thư mục cha. Các quyền của tập tin là không liên quan.

Đây là một tài liệu tham khảo giải thích mô hình quyền rõ ràng hơn bao giờ hết:

Mọi nỗ lực truy cập dữ liệu của tệp đều cần có quyền đọc. Mọi nỗ lực sửa đổi dữ liệu của tệp đều yêu cầu quyền ghi. Mọi nỗ lực để thực thi một tệp (chương trình hoặc tập lệnh) đều yêu cầu quyền thực thi ...

Vì các thư mục không được sử dụng giống như các tệp thông thường, các quyền hoạt động hơi (nhưng chỉ một chút) khác nhau. Một nỗ lực để liệt kê các tệp trong một thư mục yêu cầu quyền đọc cho thư mục, nhưng không phải trên các tệp trong đó. Một nỗ lực để thêm một tập tin vào một thư mục, xóa một tập tin từ một thư mục hoặc để đổi tên một tập tin, tất cả đều yêu cầu quyền ghi cho thư mục, nhưng (có lẽ đáng ngạc nhiên) không cho các tập tin trong. Thực thi quyền không áp dụng cho các thư mục (một thư mục cũng không thể là một chương trình). Nhưng bit quyền đó được sử dụng lại cho các thư mục cho các mục đích khác.

Thực thi quyền là cần thiết trên một thư mục để có thể cd vào nó (nghĩa là để làm cho một số thư mục thư mục làm việc hiện tại của bạn).

Thực thi là cần thiết trên một thư mục để truy cập thông tin "inode" của các tập tin trong. Bạn cần điều này để tìm kiếm một thư mục để đọc các nút của các tệp trong đó. Vì lý do này, quyền thực thi trên một thư mục thường được gọi là quyền tìm kiếm thay thế.


2
Vì vậy, nếu tôi muốn tạo một thư mục trong đó một số tệp không thể bị xóa / thay đổi mà không thực hiện chmod trước, nhưng những người khác có thể tự do ghi lại, điều đó là không thể? Tôi sẽ phải kiểm tra thư mục 555, điều đó có nghĩa là không có tệp nào trong thư mục có thể được tạo hoặc sửa đổi.
Magnus

3
@Magnus - Tất nhiên, không có gì ngăn bạn tạo một thư mục con có thể ghi trong thư mục chỉ đọc và lưu trữ các tệp có thể ghi của bạn bên trong đó. Thư mục con tự nó không thể bị xóa, nhưng nội dung của nó có thể.
ire_and_curses

7
Bạn không thể tạo một thư mục dính +tđể mọi người không còn có thể sửa đổi hoặc xóa các tệp trong thư mục mà họ không sở hữu ngay cả khi họ có quyền ghi vào thư mục?
Shadur

3
@Magnus Nếu bạn có quyền truy cập root (bao gồm sudo), bạn có thể sử dụng chattrđể thêm cờ bất biến vào các tệp. Nếu không, thì ire_and_curses hoàn toàn chính xác.
James O'Gorman

6
Không sử dụng rm -f chỉ hoạt động miễn là tôi tỉnh táo ... cộng với, tôi không biết các tập lệnh bash bị chậm mà tôi viết có thể hoặc không thể làm gì
Magnus

53

Ok, theo nhận xét của bạn cho ire_and_curses, điều bạn thực sự muốn làm là làm cho một số tệp không thay đổi. Bạn có thể làm điều đó với chattrlệnh. Ví dụ:

ví dụ

$ 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

Bạn không thể làm bất cứ điều gì với một tập tin bất biến - bạn không thể xóa nó, chỉnh sửa nó, ghi đè lên nó, đổi tên nó, chmod hoặc chown nó, hoặc bất cứ điều gì khác. Điều duy nhất bạn có thể làm với nó là đọc nó (nếu quyền unix cho phép) và (với quyền root) chattr -iđể loại bỏ bit bất biến.

Không phải tất cả các hệ thống tập tin hỗ trợ tất cả các thuộc tính. AFAIK, bất biến được hỗ trợ bởi tất cả các hệ thống tệp linux phổ biến (bao gồm ext2 / 3/4 và xfs. Zfsonlinux hiện tại không hỗ trợ các thuộc tính)


3
đôi khi nó hữu ích. btw, thậm chí root không thể sửa đổi hoặc xóa một tập tin bất biến (không phải không loại bỏ thuộc tính bất biến đầu tiên). cũng btw, sử dụng lsattrđể liệt kê các thuộc tính.
cas

2
+1 - Tôi đã quên về các thuộc tính và rất bận rộn khi trả lời câu hỏi theo nghĩa đen về rmđiều này thậm chí không bao giờ xảy ra với tôi ...
ire_and_curses

2
Đây là hệ thống tập tin cụ thể và điều này có thể mang lại cho bạn nhiều vấn đề hơn mà nó giải quyết.
Stéphane Gimenez

4
@Magnus: các sự cố có thể xảy ra bao gồm sao lưu (không phải tất cả các tiện ích sao lưu sẽ sao lưu các thuộc tính - thực tế là hầu hết sẽ không) và khôi phục (nếu bạn khôi phục vào thư mục đã chứa tệp không thay đổi, một số chương trình sẽ xử lý không thể ghi đè tệp đó như một lỗi nghiêm trọng và hủy bỏ). Ngoài ra, bạn có thể tự gây nhầm lẫn nếu bạn quên rằng bạn đã tạo một tệp bất biến và không thể hiểu tại sao bạn không thể xóa nó .... thông báo lỗi 'Thao tác không được phép' là cùng một thông báo lỗi bạn thấy với một số loại hệ thống tệp tham nhũng, có thể dẫn đến phản ứng quá mức nguy hiểm tiềm tàng.
cas

1
Bạn có thể sao chép (cp) một tập tin bất biến.
Bạch tuộc

0

Một câu trả lời cho câu hỏi này tuyên bố rằng bạn chỉ có thể xóa một tệp khỏi thư mục nếu nó chỉ có writequyền là hoàn toàn sai! hãy thử nó! Cung cấp một thư mục chỉ writecho phép và cố gắng xóa, bạn không thể!
Để xóa một tập tin trong một thư mục, bạn cần cả hai writevà sự executecho phép trên thư mục

Bây giờ trở lại câu hỏi: để xóa một tập tin bằng cách sử dụng rmbạn chỉ cần xóa thông tin inode của nó khỏi thư mục tức là bạn không phải là shreddingnó từ đĩa. Nếu thông tin inode của tập tin không có trong thư mục, bạn không thể truy cập (cũng bởi vì bạn không thể nhìn thấy nó vì nó không được liệt kê bởi thư mục mẹ của nó), tức là nó sẽ bị xóa cho bạn.
Do đó, để xóa một tập tin từ một thư mục tất cả các bạn là sự cho phép trên thư mục; quyền trên tập tin đó là không liên quan

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.