Tại sao có thể xóa toàn bộ hệ thống tập tin?


24

Sau khi phạm phải sai lầm tai tiếng là xóa toàn bộ hệ thống tệp của mình sudo rm -rf /*, phục hồi sau thiệt hại khủng khiếp mà tôi đã gây ra và đối phó với thực tế là tôi vừa mất 6 năm tuổi thọ, tôi bắt đầu tự hỏi tại sao thậm chí có thể làm điều đó, và những gì có thể được thực hiện để ngăn chặn sai lầm này xảy ra.

Một giải pháp được đề xuất cho tôi là thu hồi quyền truy cập root từ tài khoản của tôi, nhưng điều đó thật bất tiện, bởi vì rất nhiều lệnh yêu cầu quyền truy cập root và khi bạn phải chạy vài chục lệnh mỗi ngày, điều đó gây khó chịu.

Sao lưu hệ thống của bạn là cách rõ ràng để đi. Nhưng việc khôi phục bản sao lưu cũng đòi hỏi một số thời gian chết và tùy thuộc vào hệ thống của bạn mà thời gian chết có thể là vài ngày hoặc vài tuần, điều này có thể không được chấp nhận trong một số trường hợp.

Câu hỏi của tôi là: Tại sao không thực hiện xác nhận khi người dùng cố gắng xóa hệ thống tập tin của họ? Vì vậy, khi bạn thực sự muốn làm điều đó, bạn chỉ cần nhấn Y hoặc nhập và nếu ít nhất bạn không mất tất cả.



20
"Tại sao thậm chí có thể làm điều đó?" Tại sao không nên? Có những lý do hoàn toàn chính đáng để xóa nội dung của hệ thống phân cấp thư mục và có rất nhiều tập hợp con /sẽ gần như xấu khi xóa ( /etc/ví dụ). Nó đơn giản không phải là công việc rmquyết định thư mục nào có thể hoặc không thể dễ dàng bị xóa.
chepner

2
Tiêu đề cho biết "Tại sao có thể xóa hệ thống?" trong khi câu hỏi tự hỏi "Câu hỏi của tôi là: Tại sao không thực hiện xác nhận khi người dùng cố xóa hệ thống tập tin của họ?". Vì vậy, điều này làm cho câu hỏi không rõ ràng. Câu hỏi nào là câu hỏi thực tế của bạn để chúng tôi ít nhất biết câu trả lời? Vui lòng chỉnh sửa bài viết của bạn để làm rõ
Sergiy Kolodyazhnyy

3
Câu hỏi thực sự ở đây là gì? Tôi có thể thấy ba: (1) Tại sao nó có thể? (2) Làm thế nào để ngăn chặn việc đó?, Và (3) Tại sao không thực hiện xác nhận? - Chúng không phải là cùng một câu hỏi, thứ nhất yêu cầu lý luận, thứ hai cho các công cụ. (Cái thứ ba có liên quan đến cái thứ hai, nhưng vẫn không thực sự giống nhau. Một xác nhận không phải là cách duy nhất để ngăn chặn điều gì đó.)
ilkkachu

10
Nếu bạn không yêu cầu làm rõ từ tác giả của câu hỏi, xin vui lòng không bình luận gì cả . Tôi thấy rất nhiều bình luận tự chúc mừng ở đây, giải thích đây là lỗi của OP vì không biết ý nghĩa của các cờ hoặc không có bản sao lưu hoặc bất cứ điều gì. Tôi rất vui khi biết rằng rất nhiều người dùng của chúng tôi đủ khôn ngoan để có bản sao lưu và không chạy các lệnh mà họ không hiểu. Điều đó hoàn toàn tuyệt vời đối với họ, nhưng về cơ bản là không có ích cho OP, người có lẽ cũng đã học được bài học này cho đến bây giờ. Vì vậy, hãy dừng việc đắm chìm trong sự sáng chói của chính chúng ta và chỉ trả lời câu hỏi.
terdon

Câu trả lời:


16

rmlà một công cụ hệ thống cấp thấp. Các công cụ này được xây dựng đơn giản nhất có thể vì chúng phải có mặt trên bất kỳ hệ thống nào. rmdự kiến ​​sẽ có hành vi nổi tiếng, đặc biệt là liên quan đến lời nhắc xác nhận để có thể sử dụng nó trong các tập lệnh.

Thêm một trường hợp đặc biệt để nhắc nhở rm /*sẽ không thể thực hiện được vì lệnh rm không nhìn thấy nó trong biểu mẫu này. Ký *tự đại diện được mở rộng bằng vỏ trước khi được truyền tới rm, vì vậy lệnh thực sự cần một trường hợp đặc biệt sẽ giống như vậy rm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz. Thêm mã để kiểm tra trường hợp này (có thể sẽ khác trên các linux khác nhau) sẽ là một thách thức phức tạp cũng như dễ bị lỗi tinh vi. Linux tiêu chuẩn rmcó một bảo vệ mặc định chống lại sự phá hủy hệ thống bằng cách từ chối loại bỏ /mà không có --no-preserve-roottùy chọn.

Theo mặc định, có ba biện pháp bảo vệ chống xóa hệ thống của bạn theo cách này:

  1. Quyền - người dùng thông thường sẽ không thể xóa các tệp quan trọng. Bạn đã bỏ qua điều này với sudo
  2. Thư mục - theo mặc định rm sẽ không xóa thư mục. Bạn đã bỏ qua điều này với cờ -r
  3. Viết các tệp được bảo vệ - theo mặc định, rm sẽ yêu cầu xác nhận trước khi xóa tệp được bảo vệ ghi (điều này sẽ không dừng tất cả các thiệt hại, nhưng có thể đã cung cấp lời nhắc trước khi hệ thống không thể khôi phục được). Bạn đã bỏ qua sự bảo vệ này với cờ -f

Để xóa tất cả nội dung của một thư mục, thay vì chạy rm /path/to/folder/*, hãy làm rm -rf /path/to/folder, mkdir /path/to/foldervì điều này sẽ kích hoạt --preserve-rootbảo vệ cũng như xóa bất kỳ dấu chấm nào trong thư mục


3
"Rm dự kiến ​​sẽ có hành vi nổi tiếng" và thực tế nó là một trong những công cụ được chỉ định bởi tiêu chuẩn POSIX. "he * wildcard được mở rộng bằng shell trước khi được chuyển sang rm" Chính xác, vì vậy việc thêm kiểm tra cho tất cả các loại tham số, có thể là liên kết tượng trưng đến các thư mục và tệp thực tế /sẽ mất rất nhiều kết hợp và cân nhắc, vì vậy nó không thực tế. Và quay trở lại ý tưởng về các tiêu chuẩn, thêm các kiểm tra như vậy sẽ phá vỡ hành vi nhất quán
Sergiy Kolodyazhnyy

Đó chính xác safe-rmlà lý do tại sao là một trình bao bọc xung quanh rm: Bằng cách này, nó có thể kiểm tra mọi đối số duy nhất (thay vì toàn bộ dòng lệnh ngẫu nhiên), xác minh nó không nằm trong danh sách đen có thể định cấu hình và chỉ sau đó gọi rmvới các đối số đã được xác minh. Điều đó không quá phức tạp cũng không dễ bị lỗi.
tráng miệng

59

Gặp gỡ safe-rmCài đặt an toàn-rm, trình bao bọc của xung quanh rmlệnh để ngăn chặn việc vô tình xóa đi:

safe-rm ngăn chặn việc vô tình xóa các tệp quan trọng bằng cách thay thế rmbằng trình bao bọc để kiểm tra các đối số đã cho đối với danh sách đen các tệp và thư mục có thể định cấu hình không bao giờ bị xóa.

Người dùng cố gắng xóa một trong những tệp hoặc thư mục được bảo vệ này sẽ không thể làm như vậy và sẽ được hiển thị một thông báo cảnh báo thay thế. ( man safe-rm)

Nếu liên kết cài đặt ở trên không hoạt động, bạn chỉ cần sử dụng sudo apt install safe-rmthay thế. Cấu hình mặc định đã chứa các thư mục hệ thống, rm /*ví dụ: hãy thử :

$ rm /*
safe-rm: skipping /bin
safe-rm: skipping /boot
safe-rm: skipping /dev
safe-rm: skipping /etc
safe-rm: skipping /home
safe-rm: skipping /lib
safe-rm: skipping /proc
safe-rm: skipping /root
safe-rm: skipping /sbin
safe-rm: skipping /sys
safe-rm: skipping /usr
safe-rm: skipping /var
…

Như bạn thấy, điều này sẽ ngăn bạn xóa /home, nơi tôi cho rằng các tệp cá nhân của bạn được lưu trữ. Tuy nhiên, nó không ngăn bạn xóa ~hoặc bất kỳ thư mục con nào của nó nếu bạn cố xóa chúng trực tiếp. Để thêm ~/precious_photosthư mục, chỉ cần thêm đường dẫn tuyệt đối của nó với dấu ngã được phân giải thành safe-rmtệp cấu hình /etc/safe-rm.conf, vd:

echo /home/dessert/precious_photos | sudo tee -a /etc/safe-rm.conf

Đối với trường hợp bạn chạy rmmà không sudo1-flá cờ đó là một ý tưởng tốt để thêm mộtalias cho vỏ của bạn mà làm cho rm's -icờ mặc định. Cách này rmyêu cầu mọi tệp trước khi xóa nó:

alias rm='rm -i'

Một cờ hữu ích tương tự là -I, nó chỉ cảnh báo cho Google một lần trước khi xóa hơn ba tệp hoặc khi xóa đệ quy, đó là ít xâm phạm hơn -i, trong khi vẫn bảo vệ chống lại hầu hết các lỗi lầm:

alias rm='rm -I'

Mối nguy hiểm chung của những bí danh này là bạn dễ dàng có thói quen dựa vào chúng để cứu bạn, điều này có thể gây tác dụng ngược khi sử dụng một môi trường khác.


1: sudobỏ qua của các bí danh , người ta có thể làm việc xung quanh rằng bằng cách định nghĩa alias sudo='sudo 'mặc dù


25

Xác nhận đã có, vấn đề là -ftrong lệnh, nghĩa là --force; Khi người dùng buộc thực hiện một thao tác, họ phải biết họ đang làm gì (rõ ràng là một lỗi luôn có thể xảy ra).

Một ví dụ:

 rm -r ./*
 rm: remove write-protected regular file './mozilla_mvaschetto0/WEBMASTER-04.DOC'? N
 rm: cannot remove './mozilla_mvaschetto0': Directory not empty
 rm: descend into write-protected directory './pulse-PKdhtXMmr18n'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-bolt.service-rZWMCb'? n
 rm: descend into write-protected directory './systemd-private-     890f5b31987b4910a579d1c49930a591-colord.service-4ZBnUf'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-fwupd.service-vAxdbk'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-minissdpd.service-9G8GrR'? 
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-ModemManager.service-s43zUX'? nn
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-rtkit-daemon.service-cfMePv'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-systemd-timesyncd.service-oXT4pr'? n
 rm: descend into write-protected directory './systemd-private-890f5b31987b4910a579d1c49930a591-upower.service-L0k9rT'? n

Nó khác với --forcetùy chọn: Tôi sẽ không nhận được bất kỳ xác nhận nào và các tệp sẽ bị xóa.

Vấn đề là để biết lệnh và các tham số của nó, điều hướng nhiều hơn trong manlệnh (cũng như nếu lệnh được tìm thấy trong hướng dẫn) ví dụ: lần đầu tiên tôi thấy lệnh tar xzf some.tar.gztôi tự hỏi mình, " xzfcó nghĩa là gì? "

Sau đó tôi đọc trang web tar và phát hiện ra nó.


Tôi không nghĩ rằng có liên quan ở đây. Tại thời điểm đầu tiên rm yêu cầu một tệp được bảo vệ chống ghi hoặc bất kỳ tệp nào, nó có thể đã xóa một loạt các tệp quan trọng.
Jonas Schäfer

1
Vì vậy, cá nhân, tôi luôn nghĩ -flà cần thiết để xóa các thư mục. Tôi thậm chí đã mở một dấu nhắc để xác nhận và khiếu nại nhưng học được rằng chỉ -rcần thiết. Tôi cho rằng rm -rfđã trở thành chuẩn mực vì nó rất hữu ích trong một kịch bản (bạn không muốn kịch bản thất bại chỉ vì bạn đang cố xóa những thứ không tồn tại) để bạn thấy nó thường xuyên, nhưng tôi cho rằng chúng ta cần hãy thận trọng về việc chỉ sử dụng rm -rnhư "mặc định" của chúng tôi khi ở trong vỏ (có thể hiểu là không có giả định "mặc định" nào bạn không hiểu, đặc biệt là với sudo, nhưng mọi người sẽ là người và ít nhất điều này an toàn hơn).
Thuyền trưởng Man

2
Rmdir là cách an toàn nhất để xóa thư mục
AtomiX84

rmkhông yêu cầu xác nhận theo mặc định, nó chỉ yêu cầu nó cho các thư mục và tập tin được bảo vệ chống ghi. Nếu bạn chạy lệnh đó trên máy, có lẽ bạn đã xóa rất nhiều tệp của riêng mình. Nếu bạn cần rmyêu cầu xác nhận, bạn cần truyền -itham số. Ví dụ:rm -ir ./*
Dan

8

Chạy mà không có bản sao lưu có nghĩa là bạn phải cực kỳ cẩn thận để không bao giờ mắc lỗi. Và hy vọng phần cứng của bạn không bao giờ thất bại. (Ngay cả RAID cũng không thể cứu bạn khỏi hỏng hệ thống tệp do RAM bị lỗi.) Vì vậy, đó là vấn đề đầu tiên của bạn. (Mà tôi cho rằng bạn đã nhận ra và sẽ thực hiện sao lưu trong tương lai.)


Nhưng có những điều bạn có thể làm để giảm khả năng mắc lỗi như thế này:

  • bí danh rm='rm -I'để nhắc nếu xóa nhiều hơn 3 điều.
  • bí danh mv và cp đến mv -icp -i(nhiều trường hợp sử dụng thông thường cho những trường hợp này không liên quan đến việc ghi đè tệp đích).
  • bí danh sudo='sudo 'để thực hiện mở rộng bí danh trên đối số đầu tiên đểsudo

Tôi thấy rm -Ilà hữu ích hơn nhiều rm -i. Nó thường không nhắc nhở trong quá trình sử dụng bình thường, vì vậy, nhắc nhở khi bạn không mong đợi nó là cảnh báo tốt hơn / đáng chú ý hơn nhiều. Với -i(trước khi tôi phát hiện ra -I), tôi đã quen với việc gõ \rmđể tắt mở rộng bí danh, sau khi chắc chắn rằng tôi đã gõ lệnh chính xác.

Bạn không muốn có thói quen dựa vào rm -ihoặc -Ibí danh để cứu bạn . Đó là dòng an toàn của bạn mà bạn hy vọng không bao giờ được sử dụng. Nếu tôi thực sự muốn tương tác chọn những gì phù hợp để xóa, hoặc tôi không chắc liệu toàn cầu của tôi có thể khớp với một số tệp bổ sung hay không, tôi nhập thủ công rm -i .../*whatever*. (Cũng là một thói quen tốt trong trường hợp bạn từng ở trong một môi trường không có bí danh của bạn).

Bảo vệ chống lại ngón tay mập Enterbằng cách gõ ls -d /*foo*trước , sau đó mũi tên lên và thay đổi điều đó thành rm -rsau khi bạn nhập xong. Vì vậy, dòng lệnh không bao giờ chứa rm -rf ~/hoặc các lệnh nguy hiểm tương tự tại bất kỳ điểm nào. Bạn chỉ " điều khiển " nó bằng cách thay đổi lsthành rmbằng control-a, alt-d để đi đến đầu dòng và thêm -rhoặc -fsau khi bạn nhập xong ~/some/sub/dir/phần lệnh.

Tùy thuộc vào những gì bạn đang xóa, thực sự chạy ls -dđầu tiên, hoặc không, nếu điều đó sẽ không thêm bất cứ điều gì vào những gì bạn thấy khi hoàn thành tab. Bạn có thể bắt đầu bằng rm(không có -rhoặc -rf) vì vậy nó chỉ là control-a / control-right (hoặc alt + f) / space / -r.

(Làm quen với các phím bấm chỉnh sửa mạnh mẽ của bash / readline để di chuyển nhanh, như mũi tên điều khiển hoặc alt + f / b để di chuyển bằng từ và giết toàn bộ từ bằng alt + backspace hoặc alt + d hoặc control-w. Và điều khiển -u để giết đến đầu dòng. Và điều khiển- / để hoàn tác chỉnh sửa nếu bạn đi quá một bước. Và dĩ nhiên lịch sử mũi tên lên mà bạn có thể tìm kiếm bằng control-r / control-s.)

Tránh -rftrừ khi bạn thực sự cần nó để tắt tiếng nhắc về việc xóa các tệp chỉ đọc.

Dành thêm thời gian để suy nghĩ trước khi nhấn return sudolệnh. Đặc biệt là nếu bạn không có bản sao lưu đầy đủ, hoặc bây giờ sẽ là thời điểm tồi tệ để phải khôi phục từ chúng.


6

Câu trả lời ngắn gọn là không chạy lệnh như vậy.

Câu chuyện dài là nó là một phần của sự tùy biến. Về cơ bản có hai yếu tố chơi ở đây. Một là bạn có thể tự do sửa đổi tất cả các tập tin.

Thứ hai là lệnh rm cung cấp đường cú pháp hữu ích để xóa tất cả các tệp trong một thư mục.

Thực tế, điều này có thể được trình bày lại dưới dạng một nguyên lý đơn giản của các máy Unix. Tất cả mọi thứ là một tập tin . Để làm cho vấn đề tốt hơn, có các điều khiển truy cập, nhưng chúng bị ghi đè bởi việc sử dụng

sudo

Tôi đoán bạn có thể thêm một bí danh hoặc một chức năng để đảm bảo rằng điều này không bao giờ có thể chạy được.


4

Nếu mức sử dụng không gian tệp hệ thống của bạn không lớn (và ngày nay, 'bao la' có nghĩa là 'hàng trăm gigabyte trở lên'), hãy tạo một số trường hợp máy ảo và luôn hoạt động bên trong một. Phục hồi sẽ chỉ đòi hỏi sử dụng một ví dụ sao lưu.

Hoặc bạn có thể tạo ra một nhà tù chroot và làm việc bên trong nó. Bạn vẫn cần một số phục hồi nếu nó bị hỏng, nhưng điều đó sẽ dễ dàng hơn với một hệ thống (bao vây) đang hoạt động.


Đây có lẽ là câu trả lời hiệu quả nhất, vì nó có thể bảo vệ chống lại mọi thiệt hại, ngay cả các tập lệnh của bên thứ ba. Bạn chỉ phải lo lắng về phần mềm độc hại thực tế.
PyRulez

Suy nghĩ của một góc độ khác. Thật đáng để hỏi tại sao bạn cần thực hiện xóa đệ quy ngay từ đầu. Có lẽ những gì thực sự cần thiết là một số kịch bản để loại bỏ một dự án, vv
Loren Rosen

"Thật đáng để hỏi tại sao bạn cần phải xóa đệ quy ngay từ đầu." Chà, chỉ vì không có lệnh được xây dựng không có nghĩa là bạn vẫn không thể phạm sai lầm. Tập lệnh của bên thứ ba có thể xóa từng tệp một từ thư mục. Và có nhiều cách khác để làm hỏng hệ thống chỉ chạm vào một tệp. Tuy nhiên, thay thế rmbằng sự safe-rmgiúp đỡ, ít nhất.
PyRulez

Quan niệm của tôi với kịch bản là nó sẽ có một khái niệm tích hợp về một "dự án" hoặc tương tự. Có lẽ bạn có một tệp trống ở gốc dự án được gọi .project_root, hoặc, nếu hệ thống tệp hỗ trợ nó, một thuộc tính trên chính thư mục. Sau đó, tập lệnh sẽ đi lên cây tệp tìm kiếm gốc của dự án và phàn nàn rằng thư mục hiện tại không có trong một dự án. Hoặc, nếu tất cả các dự án đều sống ở cùng một nơi, kịch bản có thể yêu cầu bạn đặt tên cho một dự án. Bạn vẫn có thể xóa dự án sai, nhưng không phá hủy toàn bộ hệ thống.
Loren Rosen

... Ngoài ra, một biến thể của chrootsẽ là sử dụng thứ gì đó như Docker (mà tôi nghĩ thực sự sử dụng chrootdưới vỏ bọc). Đối với các tệp khác bạn chỉ cần đọc, gắn kết hệ thống tệp chỉ đọc.
Loren Rosen

3

rmlà một lệnh Unix rất cũ và có khả năng không được thiết kế dành cho người dùng. Nó cố gắng thực hiện chính xác những gì nó yêu cầu, khi nó có quyền. Một điều đáng tiếc cho nhiều người dùng mới là họ thường xuyên thấy mã sudovà không nghĩ nhiều về việc sử dụng nó. Chức năng mà trực tiếp chỉnh sửa các tập tin như rm, dd, chrootvv cần cẩn thận trong việc sử dụng.

Ngày nay tôi thích sử dụng trash(không có sudo) từ thùng rác . Nó hoạt động như Thùng rác từ Windows, trong đó bạn có thể dễ dàng truy xuất các tệp vô tình bị xóa. Ubuntu đã có thư mục Thùng rác và chức năng chuyển sang thùng rác được tích hợp trong Tệp.

Thậm chí sau đó bạn có thể mắc lỗi, vì vậy hãy đảm bảo sao lưu toàn bộ hệ thống tệp của bạn.

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.