Làm thế nào để ngăn chặn một rm -rf nhầm cho các thư mục cụ thể?


8

Tôi nghĩ rằng khá nhiều người ở đây đã nhầm lẫn rm -rfthư mục sai và hy vọng nó không gây ra thiệt hại lớn .. Có cách nào để ngăn người dùng thực hiện một câu chuyện kinh dị unix tương tự không ?? Ai đó đã đề cập (trong phần bình luận của liên kết trước ) rằng

... Tôi khá chắc chắn bây giờ mọi khóa học hoặc công ty unix sử dụng unix đều đặt rm -fr để vô hiệu hóa tài khoản của những người đang cố gắng chạy nó hoặc ngăn họ chạy nó ...

Có bất kỳ triển khai nào trong bản phân phối Unix hoặc Linux hiện tại không? Và thực tế phổ biến để ngăn chặn lỗi đó ngay cả từ một sysadmin (có quyền truy cập root) là gì?

Có vẻ như đã có một số bảo vệ cho thư mục gốc ( /) trong Solaris (từ năm 2005) và GNU (từ năm 2006). Có cách nào để thực hiện cùng một cách bảo vệ cho một số thư mục khác không ??

Để cho rõ ràng hơn, tôi đã không hỏi về lời khuyên chung về rmviệc sử dụng (và tôi đã cập nhật tiêu đề để chỉ ra điều đó nhiều hơn), tôi muốn một cái gì đó giống như bảo vệ thư mục gốc: để rm -rf /bạn phải truyền một tham số cụ thể: rm -rf --no-preserve-root /.. Có triển khai tương tự cho tập hợp các thư mục tùy chỉnh? Hoặc tôi có thể chỉ định các tệp ngoài /việc được bảo vệ bởi tùy chọn bảo tồn gốc không?


11
1) Quản lý thay đổi 2) Sao lưu.
mattdm

6
có lẽ cách duy nhất là thay thế rmlệnh bằng lệnh không có tính năng đó.
Keith

2
safe-rm có lẽ
sr_

2
hầu hết các distro làm `alias rm = 'rm -i', điều này khiến rm hỏi bạn nếu bạn chắc chắn. bên cạnh đó: biết những gì bạn đang làm. chỉ trở thành root nếu cần thiết. đối với bất kỳ người dùng nào có quyền bảo mật quyền root dưới bất kỳ hình thức nào đều phải được người dùng thực hiện trong và. thuê ai đó nếu bạn không thể tự làm điều đó. Đến lúc nào thì bất kỳ biện pháp đối phó nào cũng trở nên tương đương với dòng bí danh ở trên nếu bạn không thể tự mình giải quyết vấn đề.
Bananguin

1
@amyassin sử dụng rm -rfcó thể là một sự kiện tạo sơ yếu lý lịch. Kiểm tra và kiểm tra ba lần trước khi thực hiện nó
midnightsteel

Câu trả lời:


15

Để tránh nhầm lẫn rm -rf, không gõrm -rf .

Nếu bạn cần xóa một cây thư mục, tôi khuyên bạn nên thực hiện quy trình sau:

  • Nếu cần, thay đổi thành cha mẹ của thư mục bạn muốn xóa.
  • mv directory-to-delete DELETE
  • Khám phá DELETEvà kiểm tra xem đó có thực sự là những gì bạn muốn xóa không
  • rm -rf DELETE

Không bao giờ gọi rm -rfvới một đối số khác DELETE. Việc xóa trong một số giai đoạn sẽ cho bạn cơ hội để xác minh rằng bạn không xóa nhầm, vì lỗi chính tả ( rm -rf /foo /barthay vì rm -rf /foo/bar) hoặc vì chữ braino (ôi, không, tôi có nghĩa là xóa foo.oldvà giữ foo.new) .

Nếu vấn đề của bạn là bạn không thể tin người khác không gõ rm -rf, hãy xem xét xóa đặc quyền quản trị viên của họ. Có rất nhiều điều có thể đi sai hơn rm.


Luôn luôn sao lưu .

Định kỳ xác minh rằng các bản sao lưu của bạn đang hoạt động và cập nhật.

Giữ mọi thứ không thể dễ dàng tải xuống từ đâu đó dưới sự kiểm soát phiên bản.


Với một hệ thống unix cơ bản, nếu bạn thực sự muốn làm cho một số thư mục không thể xóa được bằng cách rmthay thế (hoặc bóng tốt hơn) rmbằng một tập lệnh tùy chỉnh từ chối một số đối số nhất định. Hoặc bởi hg rm.

Một số biến thể unix cung cấp nhiều khả năng hơn.

  • Trên OSX, bạn có thể thiết lập danh sách kiểm soát truy cập trên thư mục ngăn chặn việc xóa các tệp và thư mục con bên trong nó, mà không ngăn chặn việc tạo các mục mới hoặc sửa đổi các mục hiện có: chmod +a 'group:everyone deny delete_child' somedir(điều này không ngăn chặn việc xóa các tệp trong thư mục con: if bạn muốn điều đó, cũng đặt ACL trên thư mục con).
  • Trên Linux, bạn có thể đặt quy tắc trong SELinux, AppArmor hoặc các khung bảo mật khác cấm rmsửa đổi các thư mục nhất định.

Vâng sao lưu là giải pháp tuyệt vời nhất, nhưng tôi đã nghĩ đến một cái gì đó giống như --no-preserve-roottùy chọn, cho thư mục quan trọng khác .. Và điều đó dường như không tồn tại ngay cả khi thực hành ...
amyassin

Tôi đã chỉnh sửa câu hỏi để cho biết tôi muốn gì hơn ...
amyassin

1
@amyassin Tôi sợ không còn gì nữa (ít nhất là không có trên Linux). rm -rfđã có nghĩa là xóa xóa cái này, vâng tôi chắc chắn tôi biết tôi đang làm gì. Nếu bạn muốn nhiều hơn, thay thế rmbằng một tập lệnh từ chối xóa các thư mục nhất định.
Gilles 'SO- ngừng trở nên xấu xa'

Vui lòng chỉnh sửa nhận xét cuối cùng cho câu hỏi vì tôi nghĩ rằng nó đang trả lời tốt câu hỏi ...
amyassin

2
@amyassin Thật ra, tôi lấy lại cái này. Không có gì hơn trên Linux truyền thống, nhưng bạn có thể đặt quy tắc Apparmor / SELinux / Hoài ngăn không cho rmtruy cập vào các thư mục nhất định. Ngoài ra, vì câu hỏi của bạn không chỉ về Linux, nên tôi đã đề cập đến OSX, có một cái gì đó hơi giống với những gì bạn muốn.
Gilles 'SO- ngừng trở nên xấu xa'

4

Nếu bạn đang sử dụng rm *và zsh, bạn có thể đặt tùy chọn rmstarwait:

setopt rmstarwait

Bây giờ, vỏ cảnh báo khi bạn đang sử dụng *:

> zsh -f
> setopt rmstarwait
> touch a b c
> rm *
zsh: sure you want to delete all the files in /home/unixuser [yn]? _

Khi bạn từ chối nó ( n), không có gì xảy ra. Nếu không tất cả các tập tin sẽ bị xóa.


Sử zsh -fdụng để làm gì?
James

3

Để bảo vệ chống lại sự cố rm -rf *trong thư mục, hãy tạo một tệp có tên "-i" (bạn có thể thực hiện việc này với emacs hoặc một số chương trình khác) trong thư mục đó. Shell sẽ cố gắng diễn giải -i và sẽ khiến nó chuyển sang chế độ tương tác.

Ví dụ: Bạn có một thư mục được gọi rmtestvới tệp có tên -ibên trong. Nếu bạn cố gắng rmmọi thứ trong thư mục, rmtrước tiên sẽ được -ichuyển qua nó và sẽ chuyển sang chế độ tương tác. Nếu bạn đặt một tập tin như vậy trong các thư mục bạn muốn có một số bảo vệ trên, nó có thể giúp đỡ.

Lưu ý rằng điều này là không hiệu quả chống lại rm -rf rmtest.


Tôi đã chỉnh sửa câu hỏi để cho biết tôi muốn gì hơn ...
amyassin

Thủ thuật tuyệt vời! Tập tin được tạo dễ dàng với> -i
capitano666

2

EDIT theo đề nghị của bình luận:

Bạn có thể thay đổi thuộc tính của tệp hoặc thư mục bất biến và sau đó không thể xóa nó ngay cả bằng root cho đến khi thuộc tính bị xóa.

chattr +i /some/important/file

Điều này cũng có nghĩa là tập tin không thể được ghi vào hoặc thay đổi bằng cách nào, ngay cả bằng root . Một thuộc tính khác rõ ràng có sẵn mà tôi chưa sử dụng là thuộc tính chắp thêm ( chattr +a /some/important/file. Sau đó, tệp chỉ có thể được mở trong chế độ chắp thêm, nghĩa là không xóa, nhưng bạn có thể thêm vào nó (giả sử là tệp nhật ký). chẳng hạn sẽ không thể chỉnh sửa nó vim, nhưng bạn có thể làm được echo 'this adds a line' >> /some/important/file. Sử dụng >thay vì >>sẽ thất bại.

Các thuộc tính này có thể được bỏ đặt bằng dấu trừ, nghĩa là chattr -i file

Mặt khác, nếu điều này không phù hợp, một điều tôi thực hành là luôn luôn ls /some/dirtrước tiên, và sau đó thay vì gõ lại lệnh, nhấn mũi tên CTL-A, sau đó xóa lsvà nhập vào rm -rfnếu tôi cần. Không hoàn hảo, nhưng bằng cách nhìn vào kết quả của ls, bạn biết trước tay nếu đó là những gì bạn muốn.


Tôi đã chỉnh sửa câu hỏi để cho biết tôi muốn gì hơn ...
amyassin

2

Nếu bạn hiểu ngôn ngữ lập trình C, tôi nghĩ có thể viết lại mã nguồn rm và tạo một bản vá nhỏ cho kernel. Tôi đã thấy điều này trên một máy chủ và không thể xóa một số thư mục quan trọng và khi bạn gõ 'rm -rf / direcotyr', nó sẽ gửi email đến sysadmin.


1

Một lựa chọn có thể là ngừng sử dụng rm -rfvà bắt đầu sử dụng rm -ri. iTham số bổ sung có để đảm bảo rằng nó hỏi bạn có chắc chắn muốn xóa tệp không.

Có lẽ đặt cược tốt nhất của bạn với nó sẽ là bí danh rm -rithành một cái gì đó đáng nhớ như thế nào kill_it_with_fire. Bằng cách này bất cứ khi nào bạn cảm thấy muốn loại bỏ một cái gì đó, hãy tiếp tục và giết nó bằng lửa.


1
Tôi thích cái tên này, nhưng không phải flà trái ngược hoàn toàn với itùy chọn ?? Tôi đã thử nó và làm việc mặc dù ...
amyassin

@amyassin Đúng vậy. Đối với một số loại thời trang kỳ lạ, tôi nghĩ rằng tôi chỉ có rở đó. Chỉ cần sửa nó.
NlightNFotis

Tôi đã chỉnh sửa câu hỏi để cho biết những gì tôi muốn nhiều hơn ...
amyassin

-1

Tôi thích đặt tên thư mục đầu tiên như thế này:

$ rm /directoryname -rf

5
điều này vi phạm nguyên tắc POSIX.
gelraen

Tôi đã chỉnh sửa câu hỏi để cho biết những gì tôi muốn nhiều hơn ...
amyassin
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.