Làm cách nào để ngăn chặn rm tình cờ -rf / *?


164

Tôi chỉ rm -rf /*vô tình chạy , nhưng ý tôi là rm -rf ./*(chú ý ngôi sao sau cú chém).

alias rm='rm -i'--preserve-roottheo mặc định đã không cứu tôi, vậy có biện pháp bảo vệ tự động nào cho việc này không?


Tôi đã không root và hủy lệnh ngay lập tức, nhưng có một số quyền thoải mái ở đâu đó hoặc một cái gì đó bởi vì tôi nhận thấy rằng dấu nhắc Bash của tôi đã bị hỏng. Tôi không muốn dựa vào quyền và không phải root (tôi có thể mắc lỗi tương tự sudo) và tôi không muốn săn các lỗi bí ẩn vì một tệp bị thiếu ở đâu đó trong hệ thống, vì vậy, sao lưu và sudotốt , nhưng tôi muốn một cái gì đó tốt hơn cho trường hợp cụ thể này.


Về suy nghĩ hai lần và sử dụng bộ não. Tôi đang sử dụng nó thực sự! Nhưng tôi đang sử dụng nó để giải quyết một số nhiệm vụ lập trình phức tạp liên quan đến 10 điều khác nhau. Tôi đắm chìm trong nhiệm vụ này đủ sâu, không còn sức lực nào để kiểm tra cờ và đường dẫn, tôi thậm chí không nghĩ về các mệnh lệnh và lập luận, tôi nghĩ về các hành động như 'dir hiện tại trống rỗng', phần khác nhau trong não tôi chuyển chúng thành các mệnh lệnh và đôi khi nó mắc lỗi. Tôi muốn máy tính sửa chúng, ít nhất là những cái nguy hiểm.


13
FYI, bạn cũng có thể làm rm -rf . /mydirthay vì rm -rf ./mydirvà giết bất kỳ thư mục nào bạn đang ở. Tôi thấy điều này xảy ra thường xuyên hơn.
dùng606723

27
Để sử dụng một cách tương tự súng, câu hỏi này nói rằng làm cho khẩu súng nhận ra rằng tôi đang nhắm vào chân mình và không bắn, nhưng tôi không muốn có bất kỳ trách nhiệm nào khi không nhắm súng vào chân mình ngay từ đầu. Súng, và máy tính, là ngu ngốc và nếu bạn làm một điều ngu ngốc thì bạn sẽ nhận được những kết quả này. Theo cách tương tự súng, không có gì giúp bạn không bị tổn thương ngoại trừ cảnh giác và thực hành.
slillibri

73
@slillibri Ngoại trừ đó rmkhông phải là một khẩu súng, nó là một chương trình máy tính, nó thể đủ thông minh để xác định rằng người dùng sẽ xóa một số tệp quan trọng và đưa ra cảnh báo (giống như thực tế nếu bạn cố gắng làm rm -rf /mà không có sao).
Valentin Nemcev

80
@slillibri Súng có két sắt. Hỏi làm thế nào để đặt các két sắt tốt hơn vào rmlệnh là một câu hỏi sysadmin hoàn toàn hợp pháp.
Gilles

21
sudo rm / bin / rm không được đề xuất, nhưng sẽ ngăn hầu hết các rm :-)
Paul

Câu trả lời:


220

Một trong những thủ thuật tôi làm theo là đưa #vào đầu trong khi sử dụng rmlệnh.

root@localhost:~# #rm -rf /

Điều này ngăn việc vô tình thực hiện rmtrên tập tin / thư mục sai. Sau khi xác minh, loại bỏ #từ đầu. Thủ thuật này hoạt động, bởi vì trong Bash một từ bắt đầu với #nguyên nhân từ đó và tất cả các ký tự còn lại trên dòng đó bị bỏ qua. Vì vậy, lệnh chỉ đơn giản là bỏ qua.

HOẶC LÀ

Nếu bạn muốn ngăn chặn bất kỳ thư mục quan trọng, có một mẹo nữa.

Tạo một tập tin có tên -itrong thư mục đó. Làm thế nào một tập tin kỳ lạ như vậy có thể được tạo ra? Sử dụng touch -- -ihoặctouch ./-i

Bây giờ hãy thử rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

Ở đây *sẽ mở rộng -iđến dòng lệnh, vì vậy lệnh của bạn cuối cùng trở thành rm -rf -i. Do đó lệnh sẽ nhắc trước khi gỡ bỏ. Bạn có thể đặt tập tin này trong thư mục /, /home/, /etc/vv

HOẶC LÀ

Sử dụng --preserve-rootnhư một tùy chọn để rm. Trong các gói rmmới hơn coreutils, tùy chọn này là mặc định.

--preserve-root
              do not remove `/' (default)

HOẶC LÀ

Sử dụng an toàn-rm

Trích từ trang web:

Safe-rm là một công cụ an toàn nhằm ngăn chặn việc vô tình xóa các tệp quan trọng bằng cách thay thế / bin / rm bằ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ế:

$ rm -rf /usr
Skipping /usr

10
safe-rm có vẻ rất tốt, nhìn vào nó ngay bây giờ ...
Valentin Nemcev

45
an toàn-rm là gọn gàng. Ngoài ra đó là một thủ thuật tiện lợi với các -itập tin. Hah Bash ngớ ngẩn.
EricR

5
Tuyệt vời những gì loại lừa được thực hiện trong unix.
WernerCD

4
Các tập tin tạo có tên -i là hoàn toàn thiên tài. Tôi đã có thể sử dụng khoảng một năm trước khi tôi vô tình chạy rm -rf / etc / * trên VPS ... (may mắn thay, tôi chụp ảnh nhanh hàng đêm, vì vậy có thể khôi phục trong vòng dưới 45 phút).
David W

9
Đó là thiên tài. Ma thuật sẽ làtouch -- -rf
Mircea Vutcovici

46

Vấn đề của bạn:

Tôi chỉ vô tình chạy rm -rf / *, nhưng ý tôi là rm -rf ./* (chú ý ngôi sao sau dấu gạch chéo).

Giải pháp: Đừng làm vậy! Như một vấn đề thực tế, không sử dụng ./ở đầu một con đường. Dấu gạch chéo không thêm giá trị cho lệnh và sẽ chỉ gây nhầm lẫn.

./*có nghĩa tương tự như *vậy, vì vậy lệnh trên được viết tốt hơn là:

rm -rf *

Đây là một vấn đề liên quan. Tôi thấy biểu thức sau đây thường xuyên, nơi ai đó giả định FOOđược đặt thành một cái gì đó như /home/puppies. Tôi đã thấy điều này chỉ thực sự ngày hôm nay, trong tài liệu từ một nhà cung cấp phần mềm lớn.

rm -rf $FOO/

Nhưng nếu FOOkhông được đặt, điều này sẽ đánh giá rm -rf /, sẽ cố xóa tất cả các tệp trên hệ thống của bạn. Dấu gạch chéo là không cần thiết, vì vậy, vấn đề thực tế là không sử dụng nó.

Những điều sau đây sẽ làm điều tương tự và ít có khả năng làm hỏng hệ thống của bạn:

rm -rf $FOO

Tôi đã học được những lời khuyên này một cách khó khăn. Khi tôi có tài khoản siêu người dùng đầu tiên của mình cách đây 14 năm, tôi đã vô tình chạy rm -rf $FOO/từ trong một tập lệnh shell và phá hủy một hệ thống. 4 sysadins khác nhìn vào điều này và nói, 'Yup. Mọi người làm điều đó một lần. Bây giờ đây là phương tiện cài đặt của bạn (36 đĩa mềm). Đi sửa nó đi. '

Những người khác ở đây đề xuất giải pháp như --preserve-rootsafe-rm. Tuy nhiên, các giải pháp này không có sẵn cho tất cả các phương tiện Un * và có thể không hoạt động trên Solaris, FreeBSD & MacOSX. Ngoài ra, safe-rmyêu cầu bạn cài đặt các gói bổ sung trên mọi hệ thống Linux mà bạn sử dụng. Nếu bạn dựa vào safe-rm, điều gì xảy ra khi bạn bắt đầu một công việc mới và họ chưa safe-rmcài đặt? Những công cụ này là một cái nạng, và tốt hơn hết là dựa vào các mặc định đã biết và cải thiện thói quen làm việc của bạn.


19
Bạn tôi nói với tôi rằng ông không bao giờ sử dụng rm -rf *. Anh ta luôn thay đổi thư mục đầu tiên và sử dụng một mục tiêu cụ thể. Lý do là anh ta sử dụng lịch sử của vỏ rất nhiều, và anh ta lo lắng rằng có một lệnh như vậy trong lịch sử của anh ta có thể bật lên không đúng lúc.
haggai_e

@haggai_e: Mẹo hay. Khi tôi mới sử dụng Unix, tôi đã chạy một lần và gặp phải một lỗi rm -rf *cũng bị loại bỏ .... Tôi đã root, và điều này đi qua các thư mục thấp hơn như thế ../../.., và khá phá hoại. Tôi cố gắng rất cẩn thận rm -rf *kể từ đó.
Stefan Lasiewski

2
rm -rf $FOOSẽ không giúp đỡ nếu bạn cần rm -rf $FOO/$BAR. cd $FOO && rm -rf $BARsẽ giúp, mặc dù nó dài hơn.
Victor Sergienko

5
@VictorSergienko, với bash, làm thế nào về việc chỉ định ${FOO:?}, như trong rm -rf ${FOO:?}/rm -rf ${FOO:?}/${BAR:?}. Nó sẽ ngăn không cho nó dịch ra rm -rf /. Tôi có một số thông tin thêm về điều này trong câu trả lời của tôi ở đây .
Acumenus

@haggai_e: Tôi thấy đây là một trong những lời khuyên tốt nhất về chủ đề này. Tôi đã đốt cháy ngón tay của mình bằng cách sử dụng rm -rf *một vòng lặp for đã thay đổi nhầm thư mục và cuối cùng đã xóa một thứ khác. Nếu tôi đã sử dụng một mục tiêu cụ thể, nó sẽ có cơ hội nhỏ hơn để xóa điều sai.
richk 30/03/2015

30

Vì đây là trên "Serverfault", tôi muốn nói điều này:

Nếu bạn có hàng tá máy chủ trở lên, với một nhóm quản trị viên / người dùng đông đảo, ai đó sẽ đến rm -rfhoặc chownthư mục sai.

Bạn nên có kế hoạch để nhận dịch vụ bị ảnh hưởng sao lưu với MTTR ít nhất có thể.


4
Và bạn nên sử dụng máy ảo hoặc hộp dự phòng để thực hành phục hồi - tìm hiểu những gì không hoạt động và tinh chỉnh kế hoạch đã nói. Chúng tôi đang bắt đầu khởi động lại hai tuần một lần - bởi vì đã có sự cố mất điện trong tòa nhà của chúng tôi và mỗi lần nó đều đau đớn. Bằng cách thực hiện một vài lần tắt máy theo kế hoạch của tất cả các giá đỡ, chúng tôi đã cắt nó từ vài ngày chạy khoảng 3 giờ - mỗi lần chúng tôi tìm hiểu các bit nào để tự động hóa / sửa các tập lệnh init.d, v.v.
Danny Staple

Và thử lệnh này trên VM. Thật thú vị! Nhưng hãy chụp nhanh trước.
Stefan Lasiewski

23

Các giải pháp tốt nhất liên quan đến việc thay đổi thói quen của bạn không sử dụng rmtrực tiếp.

Một cách tiếp cận là chạy echo rm -rf /stuff/with/wildcards*trước. Kiểm tra xem đầu ra từ các ký tự đại diện có vẻ hợp lý không, sau đó sử dụng lịch sử của shell để thực thi lệnh trước mà không cần echo.

Một cách tiếp cận khác là giới hạn echolệnh trong các trường hợp rõ ràng rõ ràng những gì bạn sẽ xóa. Thay vì xóa tất cả các tệp trong một thư mục, hãy xóa thư mục đó và tạo một tệp mới. Một phương pháp tốt là đổi tên thư mục hiện có thành DELETE-foo, sau đó tạo một thư mục mới foovới các quyền thích hợp và cuối cùng loại bỏ DELETE-foo. Một lợi ích phụ của phương pháp này là lệnh được nhập trong lịch sử của bạn rm -rf DELETE-foo.

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

Nếu bạn thực sự khăng khăng xóa một loạt các tệp vì bạn cần giữ thư mục (vì nó phải luôn tồn tại hoặc vì bạn không có quyền tạo lại nó), hãy chuyển các tệp sang một thư mục khác và xóa thư mục đó .

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Nhấn phím Alt+ đó ..)

Xóa một thư mục từ bên trong sẽ rất hấp dẫn, vì rm -rf .nó ngắn do đó có nguy cơ lỗi chính tả thấp. Thật không may, các hệ thống điển hình không cho phép bạn làm điều đó, thật không may. Bạn có thể rm -rf -- "$PWD"thay vào đó, với nguy cơ lỗi chính tả cao hơn nhưng hầu hết chúng đều dẫn đến việc không xóa gì cả. Coi chừng điều này để lại một lệnh nguy hiểm trong lịch sử vỏ của bạn.

Bất cứ khi nào bạn có thể, sử dụng kiểm soát phiên bản. Bạn không rm, bạn cvs rmhoặc bất cứ điều gì, và đó là điều không thể làm được.

Zsh có các tùy chọn nhắc bạn trước khi chạy rmvới một đối số liệt kê tất cả các tệp trong thư mục: rm_star_silent(theo mặc định) lời nhắc trước khi thực hiện rm whatever/*rm_star_wait(tắt theo mặc định) thêm độ trễ 10 giây trong đó bạn không thể xác nhận. Điều này được sử dụng hạn chế nếu bạn định xóa tất cả các tệp trong một số thư mục, bởi vì bạn sẽ mong đợi lời nhắc này. Nó có thể giúp ngăn ngừa lỗi chính tả như rm foo *cho rm foo*.

Có rất nhiều giải pháp nổi xung quanh liên quan đến việc thay đổi rmlệnh. Một hạn chế của phương pháp này là một ngày nào đó bạn sẽ ở trên một chiếc máy thật rmvà bạn sẽ tự động gọi rm, an toàn với mong đợi của bạn về một xác nhận và điều tiếp theo bạn sẽ khôi phục lại các bản sao lưu.


mv -t DELETE_ME -- *là một chút ngu ngốc hơn.
Tobu

@Giles Không sử dụng rmtrực tiếp là lời khuyên tốt! Một thay thế thậm chí tốt hơn là sử dụng findlệnh .
aculich

Và nếu bạn cần thư mục vẫn còn, bạn có thể làm điều đó khá đơn giản bằng cách sử dụng find somedir -type f -deletesẽ xóa tất cả các tệp trong somedirnhưng sẽ để lại thư mục và tất cả các thư mục con.
aculich

19

Bạn luôn có thể làm một bí danh, như bạn đã đề cập:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

Bạn cũng có thể tích hợp nó với một ứng dụng twitter dòng lệnh để thông báo cho bạn bè về cách bạn gần như tự làm bẽ mặt mình bằng cách xóa sạch đĩa cứng của bạn bằng rm -fr /*root.


3
+1 cho telnet miku.acm.uiuc.edu
Ali

1
bí danh vang = "telnet miku.acm.uiuc.edu"
kubanczyk

Tôi không được đến trường đủ tuổi ... tầm quan trọng của nó là telnet miku.acm.uiuc.edugì?
Kyle Strand

Hãy thử nó và tìm hiểu. Nó không phá hủy. Nếu bạn hoang tưởng như bạn nên, hãy chạy trong VM.
Naftuli Kay

3
-1 Bạn không thể bí danh các lệnh có khoảng trắng trong đó, hãy để riêng / * đó là một tên không hợp lệ
xenithorb


15

Cách đơn giản nhất để ngăn ngừa vô tình rm -rf /*là tránh tất cả việc sử dụng rmlệnh! Trong thực tế, tôi luôn bị cám dỗ để chạy rm /bin/rmđể thoát khỏi lệnh hoàn toàn! Không, tôi không phải là người lãnh đạm.

Thay vào đó, hãy sử dụng -deletetùy chọn của findlệnh , nhưng trước tiên trước khi xóa các tệp tôi khuyên bạn nên xem trước những tệp nào bạn sẽ xóa:

find | less

Lưu ý, trong các phiên bản hiện đại findnếu bạn bỏ tên của một thư mục, nó sẽ hoàn toàn sử dụng thư mục hiện tại, do đó, ở trên là tương đương với:

find . | less

Khi bạn chắc chắn đây là những tệp bạn muốn xóa, bạn có thể thêm -deletetùy chọn:

find path/to/files -delete

Vì vậy, không chỉ find an toàn hơn khi sử dụng, nó còn biểu cảm hơn , vì vậy nếu bạn muốn xóa chỉ một số tệp trong hệ thống phân cấp thư mục phù hợp với một mẫu cụ thể, bạn có thể sử dụng một biểu thức như thế này để xem trước, sau đó xóa các tệp:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

Có rất nhiều lý do tốt để học và sử dụng findngoài việc an toàn hơn rm, vì vậy bạn sẽ cảm ơn chính mình sau này nếu bạn dành thời gian để học cách sử dụng find.


Thảo luận rất thú vị. Tôi thích cách tiếp cận của bạn và thực hiện một đoạn nhỏ. Đó là siêu không hiệu quả, vì nó gọi tìm thấy nhiều nhất là 3 lần, nhưng đối với tôi đây là một khởi đầu tốt đẹp: github.com/der-Daniel/fdel
Daniel Hitzel

14

Có một số lời khuyên thực sự tồi tệ trong chủ đề này, may mắn là hầu hết trong số đó đã được bỏ phiếu.

Trước hết, khi bạn cần root, hãy trở thành root - sudo và các thủ thuật bí danh khác nhau sẽ khiến bạn trở nên yếu đuối. Và tệ hơn, họ sẽ khiến bạn bất cẩn. Học cách làm mọi thứ đúng cách, dừng lại tùy thuộc vào bí danh để bảo vệ bạn. Một ngày nào đó bạn sẽ lấy được root trên một cái hộp không có bánh xe tập luyện của bạn và làm nổ tung thứ gì đó.

Thứ hai - khi bạn đã root, hãy nghĩ về bản thân như lái một chiếc xe buýt đầy trẻ em đi học. Đôi khi bạn có thể bật ra bài hát trên radio, nhưng những lần khác bạn cần nhìn cả hai cách, làm chậm mọi thứ và kiểm tra lại tất cả các gương của bạn.

Thứ ba - Bạn hầu như không bao giờ thực sự phải rm -rf- nhiều khả năng bạn muốn mv something something.bakhoặcmkdir _trash && mv something _trash/

Thứ tư - luôn là lský tự đại diện của bạn trước đây rm- Không có gì điên rồ khi nhìn vào thứ gì đó trước khi phá hủy nó mãi mãi.


2
+1 để sử dụng ls.
Sachin Divekar

@eventi Tôi đồng ý rằng có một số lời khuyên khủng khiếp và những vụ hack xấu xí trong chủ đề này. Và chắc chắn là một ý tưởng tốt để xem xét một cái gì đó trước khi phá hủy nó, nhưng có một cách thậm chí còn tốt hơn để làm điều đó bằng cách sử dụng findlệnh .
aculich

Tôi không thấy cách tìm kiếm đơn giản hơn hoặc an toàn hơn, nhưng tôi thích find . -name '*~'ví dụ của bạn . Quan điểm của tôi là lssẽ liệt kê cùng một quả cầu rmsẽ sử dụng.
eventi

11

Đây là tiêu chuẩn của tôi dành riêng cho regexps trong bối cảnh rm, nhưng nó sẽ cứu bạn trong trường hợp này.

Tôi luôn luôn làm echo foo*/[0-9]*{bar,baz}*đầu tiên, để xem những gì regrec sẽ phù hợp. Khi tôi có đầu ra, sau đó tôi quay lại với chỉnh sửa dòng lệnh và thay đổi echothành rm -rf. Tôi không bao giờ, không bao giờ sử dụng rm -rftrên một regrec chưa được kiểm tra .



5
OK, tôi đang tìm gì vậy? Bạn có đưa ra quan điểm rằng cú pháp regrec cho khớp tệp là khác nhau (và đôi khi được gọi bằng một tên khác) so với cú pháp được sử dụng trong ví dụ perl không? Hoặc một số điểm khác mà tôi đã bỏ lỡ? Tôi xin lỗi vì sự chậm chạp trong suy nghĩ của tôi, đó là điều đầu tiên vào sáng thứ bảy ở đây!
MadHatter

9
Những điều mà bạn đang gọi là "regrec" trên thực tế là những điều ảm đạm. Đây không phải là một cú pháp regex khác nhau; nó không phải là một regex.
bukzor

1
Lập luận đó chắc chắn có thể được đưa ra; tuy nhiên, từ bài viết trên wikipedia về các biểu thức thông thường, tôi thấy rằng "Nhiều hệ thống máy tính hiện đại cung cấp các ký tự đại diện trong tên tệp trùng khớp từ một hệ thống tệp. Đây là khả năng cốt lõi của nhiều trình vỏ dòng lệnh và còn được gọi là toàn cầu" - lưu ý sử dụng "còn được gọi là", dường như đối với tôi để chỉ ra rằng việc gọi các mã thông báo có chứa siêu dữ liệu để khớp với một hoặc nhiều tên tệp regexps không sai. Tôi đồng ý rằng globalbing là một thuật ngữ tốt hơn bởi vì nó không có nghĩa gì khác ngoài việc sử dụng các biểu thức thông thường trong khớp tên tệp.
MadHatter

1
@MadHatter Ngoài ra, globalbing, mặc dù trông hơi giống nhau, nhưng rất khác về mặt ngữ nghĩa so với các biểu thức thông thường. Trong một biểu thức chính, ý nghĩa của *một định nghĩa rất chính xác được gọi là Ngôi sao Kleene là toán tử đơn nguyên khớp với 0 hoặc nhiều phần tử của tập hợp được áp dụng (trong trường hợp biểu thức chính quy, ký tự hoặc tập hợp các ký tự đứng trước Kleene Star), trong khi trong toàn cầu *phù hợp với bất cứ điều gì trong mô hình tiếp theo. Chúng rất khác nhau về mặt ngữ nghĩa ngay cả khi chúng dường như có một cú pháp tương tự.
aculich

9

Giải pháp cho vấn đề này là sao lưu thường xuyên. Bất cứ khi nào bạn sản xuất một cái gì đó bạn không muốn có nguy cơ mất, hãy sao lưu nó. Nếu bạn thấy sao lưu thường xuyên là quá đau đớn, thì hãy đơn giản hóa quy trình để không gây đau đớn.

Ví dụ, nếu bạn làm việc trên mã nguồn, sử dụng một công cụ thích gitđể nhân bản mã và giữ lịch sử trên máy khác. Nếu bạn làm việc trên các tài liệu, có một tập lệnh rsynclà tài liệu của bạn cho một máy khác.


Một hệ thống tập tin sao chép trên ghi như btrfs cũng có thể giúp đỡ. Bạn có thể dễ dàng thiết lập một vòng quay chụp nhanh tự động đơn giản chạy cục bộ (ngoài sao lưu ngoài).
Malthe

6

Có vẻ như cách tốt nhất để giảm rủi ro này là xóa hai giai đoạn như hầu hết các GUI. Đó là, thay thế rm bằng một cái gì đó di chuyển mọi thứ vào một thư mục rác (trên cùng một khối lượng). Sau đó dọn sạch thùng rác đó sau khi đủ thời gian trôi qua để nhận thấy bất kỳ sai lầm nào.

Một tiện ích như vậy, thùng rác, được thảo luận trên Unix StackExchange, tại đây .


Đó là điều đầu tiên tôi cài đặt trên mọi máy. Nó phải là công cụ loại bỏ mặc định, với rm chỉ được sử dụng khi bạn cần loại bỏ hoàn toàn một cái gì đó ngay bây giờ. Tôi buồn vì nó chưa được cất cánh, nhưng một ngày nào đó nó sẽ xảy ra. Có lẽ sau một ví dụ rất công khai của rm gây ra một vấn đề lớn mà các bản sao lưu không thể giải quyết được. Có lẽ một cái gì đó mà thời gian để phục hồi đóng một yếu tố rất lớn.
Gerry

+1 Sau khi sử dụng linux trong 20 năm, tôi vẫn nghĩ nên có một số loại hành vi rác rưởi rm.
Shovas

3

Một yếu tố quan trọng để tránh các loại sai lầm như vậy là không đăng nhập bằng tài khoản root. Khi bạn đăng nhập bằng người dùng không có đặc quyền bình thường, bạn cần sử dụng sudocho mỗi lệnh. Vì vậy, bạn nên cẩn thận hơn.


4
Tôi không tin sudo sẽ ngăn chặn một cái gì đó như thế này. Bạn có thể tạo lỗi chính tả giống như OP, ngay cả khi bạn gõ "sudo" trước "rm".
cjc

1
Được đề cập làm việc như root trong chỉnh sửa
Valentin Nemcev

Nếu bạn vẫn không bị thuyết phục về việc sử dụng sudovà sao lưu. Hãy xem trang này: forum.synology.com/wiki/index.php/ . Nó nói về việc tạo ra một thùng rác. Hi vọng điêu nay co ich!
Khaled

1
@Khaled Tôi đang sử dụng sudo và sao lưu, tôi chỉ muốn một cái gì đó tốt hơn cho vấn đề cụ thể này
Valentin Nemcev

3

Khi tôi xóa một thư mục theo cách đệ quy, tôi đặt -r, và -fnếu có thể, ở cuối lệnh, vd rm /foo/bar -rf. Theo cách đó, nếu tôi vô tình nhấn Enter quá sớm, mà chưa gõ toàn bộ đường dẫn, lệnh sẽ không được đệ quy nên có thể vô hại. Nếu tôi va vào Enter trong khi cố gắng gõ dấu gạch chéo sau /foo, tôi đã viết rm /foochứ không phải rm -rf /foo.

Điều đó hoạt động độc đáo trên các hệ thống sử dụng lõi GNU, nhưng các tiện ích trên một số Unix khác không cho phép các tùy chọn được đặt ở cuối như thế. May mắn thay, tôi không sử dụng các hệ thống như vậy rất thường xuyên.


2

Việc này có thể phức tạp, nhưng bạn có thể thiết lập các vai trò trong SELinux để ngay cả khi người dùng trở thành root thông qua sudo su - (hoặc su su), khả năng xóa tệp có thể bị hạn chế (bạn phải đăng nhập trực tiếp dưới quyền root để xóa các tập tin). Nếu bạn đang sử dụng AppArmor, bạn có thể làm điều gì đó tương tự .

Tất nhiên, giải pháp khác là đảm bảo rằng bạn có bản sao lưu. :)


2

Tránh sử dụng Globing . Trong Bash, bạn có thể thiết lập noglob. Nhưng một lần nữa, khi bạn chuyển đến một hệ thống noglobkhông được đặt, bạn có thể quên điều đó và tiếp tục như thể nó là.

Đặt noclobberđể ngăn chặn mvcpphá hủy các tập tin quá.

Sử dụng một trình duyệt tập tin để xóa. Một số trình duyệt tệp cung cấp một thùng rác (ví dụ: Konqueror ).

Một cách khác để tránh Globing là như sau. Tại dòng lệnh, tôi echo filenamepattern >> xxx. Sau đó, tôi chỉnh sửa tệp bằng Vim hoặc vi để kiểm tra xem tệp nào sẽ bị xóa, (xem các ký tự mẫu tên tệp trong filenmate.) Và sau đó sử dụng %s/^/rm -f/để biến mỗi dòng thành lệnh xóa. Nguồn xxx. Bằng cách này bạn sẽ thấy mọi tệp sẽ bị xóa trước khi thực hiện.

Di chuyển các tập tin vào một thư mục 'gác mái' hoặc tarball. Hoặc sử dụng kiểm soát phiên bản (như đã nói trước tôi).


+1 để sử dụng một số phương pháp xem trước các tệp của bạn trước khi bạn xóa chúng, tuy nhiên có những cách đơn giản và an toàn hơn để thực hiện điều đó bằng cách sử dụng findlệnh .
aculich

2

ZSH hỏi tôi (như mặc định) trước khi thực hiện a rm -rf *.


1

Bên ngoài chattr, không có nhiều biện pháp bảo vệ để cho root chạy lệnh như vậy. Đó là lý do tại sao các nhóm thích hợp và các lệnh cẩn thận rất quan trọng khi chạy đặc quyền.

Lần tới; phạm vi các tệp bạn dự định xóa - bỏ 'f' từ rm -rf, hoặc sử dụng findvà chuyển nó đếnxargs rm


Thật tốt khi bạn đề xuất sử dụng find, nhưng tôi khuyên bạn nên sử dụng nó an toàn hơn trong câu trả lời của mình . Không cần sử dụng xargs rmvì tất cả các phiên bản hiện đại findđều có -deletetùy chọn . Ngoài ra, để sử dụng một cách an toàn, xargs rmbạn cũng cần sử dụng find -print0xargs -0 rmnếu không, bạn sẽ gặp vấn đề khi gặp phải những thứ như tên tệp có khoảng trắng.
aculich

Quan điểm của tôi không phải là về các sắc thái của xargs mà là sử dụng find trước, không xóa các tệp và sau đó tiếp tục ..
mỏng

Có, tôi nghĩ rằng việc phân loại các tệp bằng cách sử dụng findlà một gợi ý tốt, tuy nhiên các sắc thái xargsrất quan trọng nếu bạn đề xuất sử dụng nó, nếu không, nó sẽ dẫn đến sự nhầm lẫn và bực bội khi gặp các tệp có khoảng trắng (được tránh bằng cách sử dụng -deletetùy chọn).
aculich

1

Một số bí danh an toàn cho các lệnh khác, để ngăn chặn thảm họa tương tự, được tìm thấy ở đây :

# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I'                    # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

Chú ý chữ hoa -I, nó khác với -i:

nhắc một lần trước khi xóa nhiều hơn ba tệp hoặc khi xóa đệ quy. Í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 sai lầm


Mặc dù tùy chọn I sẽ không phản hồi lại những gì bạn sẽ xóa.
Calmarius

1

Tôi thường sử dụng -vcờ để xem những gì đang bị xóa và có cơ hội ^Cnhanh chóng nếu tôi có chút nghi ngờ. Không thực sự là một cách để ngăn chặn điều xấu rm, nhưng điều này có thể hữu ích để hạn chế thiệt hại trong trường hợp xảy ra sự cố.


1

Quá trình xóa của tôi trên các máy dựa trên Unix như sau.

  • Nhập ls /path/to/intented/file_or_directoryvào cửa sổ terminal và sau đó nhấn return(hoặc Tab, như mong muốn), để xem danh sách các tập tin.

Nếu mọi thứ có vẻ tốt,

  • nhấp vào up arrowphím để mang lại ls /path/to/intented/file_or_directorytừ lịch sử thiết bị đầu cuối một lần nữa.

  • thay thế lsbằng rmhoặc rm -rhoặc rm -rftheo yêu cầu. Cá nhân tôi không thích sử dụng -fcờ.

Quá trình xác nhận này cũng ngăn chặn việc thực thi rmlệnh sớm, điều gì đó đã xảy ra với tôi, trước khi tôi bắt đầu theo quy trình này.


Xem trước các tập tin trước khi xóa chúng là một ý tưởng tốt, và có một cách thậm chí còn an toàn hơn và biểu cảm hơn để làm điều đó bằng cách sử dụng find như tôi giải thích trong câu trả lời của mình .
aculich

1

Nếu bạn không có tâm trạng để có được thói quen mới ngay bây giờ, .bashrc/.profilelà một nơi tốt để thêm một số bài kiểm tra để kiểm tra xem bạn có định làm điều gì đó ngu ngốc không. Tôi đã tìm ra trong một hàm Bash tôi có thể grep cho một mẫu có thể hủy hoại ngày của tôi và đưa ra điều này:

alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of           
                        #the function so that we get the "raw" string.
myrm() {
    ARGV="$*"
    set +f #opposite of set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'another scary pattern'
    then
        echo "Do Not Operate Heavy Machinery while under the influence of this medication"
        return 1
    else
        /bin/rm $@
    fi
}

Điều tốt về nó là chỉ có Bash.

Nó rõ ràng không đủ chung chung trong hình thức đó, nhưng tôi nghĩ nó có tiềm năng, vì vậy xin vui lòng gửi một số ý tưởng hoặc ý kiến.


Thật tốt khi bạn đang cố gắng xem trước các tệp của mình trước khi xóa chúng, tuy nhiên giải pháp này quá phức tạp. Thay vào đó, bạn có thể thực hiện điều này rất đơn giản theo cách chung hơn bằngfind cách sử dụng lệnh . Ngoài ra, tôi không hiểu tại sao bạn nói "điều tốt về nó là chỉ có Bash"? Nên tránh bash-isms trong script .
aculich

Để ngăn chúng tôi khỏi "rm -rf / *" hoặc "rm -rf dir / *" khi chúng tôi muốn nói đến "rm -rf ./*" và "rm -rf dir / *" chúng tôi phải phát hiện các mẫu "/ *" và "*" (đơn giản). Nhưng chúng ta không thể chuyển tất cả các đối số dòng lệnh thông qua grep tìm kiếm một số mẫu có hại, bởi vì bash mở rộng các đối số ký tự đại diện trước khi truyền chúng (sao sẽ được mở rộng cho tất cả nội dung của một thư mục). Chúng ta cần chuỗi đối số "thô". Điều đó được thực hiện với set -f trước khi chúng ta gọi hàm "myrm", sau đó được truyền chuỗi đối số thô và grep tìm các mẫu được xác định trước. *
kln

Tôi hiểu những gì bạn đang cố gắng làm set -ftương đương với set -o noglobBash, nhưng điều đó vẫn không giải thích cho tuyên bố của bạn rằng "Điều tốt về nó là chỉ có Bash". Thay vào đó, bạn có thể loại bỏ hoàn toàn vấn đề và theo cách chung cho bất kỳ shell nào bằng cách không sử dụng rmmà chỉ sử dụng findlệnh . Bạn đã thực sự thử đề xuất đó để xem nó so sánh với những gì bạn đề xuất ở đây chưa?
aculich

@aculich bởi chỉ bash Tôi có nghĩa là không phụ thuộc python hoặc perl, mọi thứ có thể được thực hiện trong bash. Khi tôi sửa đổi .bashrc, tôi có thể tiếp tục làm việc mà không phải bỏ thói quen cũ. Mỗi lần tôi gọi rm bash sẽ đảm bảo tôi không làm điều gì ngu ngốc. Tôi chỉ cần xác định một số mẫu mà tôi muốn được cảnh báo. Giống như "*" sẽ loại bỏ mọi thứ trong thư mục hiện tại. Mọi thứ sẽ lặp lại chính xác những gì tôi muốn nhưng với một chút tương tác công việc hơn có thể được thêm vào "myrm".
kln

@aculich OK gotcha. Tôi chưa thử. Tôi nghĩ nó đòi hỏi sự thay đổi đáng kể trong quy trình làm việc. Chỉ cần kiểm tra ở đây trên Mac OS X, .bash_history của tôi là 500 và 27 trong số các lệnh đó là rm. Và những ngày này tôi không sử dụng thiết bị đầu cuối rất thường xuyên.
kln

1

Đáng buồn thay, tôi không thể để lại một bình luận ở trên do nghiệp lực không đủ, nhưng muốn cảnh báo những người khác rằng rm an toàn không phải là thuốc chữa bách bệnh cho những cơn ác mộng xóa hàng loạt vô tình.

Những điều sau đây đã được thử nghiệm trong máy ảo Linux Mint 17.1 (cảnh báo cho những người không quen thuộc với các lệnh này: KHÔNG LÀM NÀY! Thực tế, ngay cả những người quen thuộc với các lệnh này cũng có thể sẽ không bao giờ làm điều này để tránh mất dữ liệu thảm khốc):

Phiên bản văn bản (cô đọng):

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

Phiên bản hình ảnh (đầy đủ):

nhập mô tả hình ảnh ở đây


1

Tôi thích cách tiếp cận cửa sổ của thùng rác.

Tôi thường tạo một thư mục có tên "/ tmp / recyclbin" cho mọi thứ tôi cần xóa:

mkdir /tmp/recyclebin

Và không bao giờ sử dụng rm -rf, tôi luôn sử dụng:

mv target_folder /tmp/recyclebin

Sau đó, tôi làm trống thùng rác bằng cách sử dụng tập lệnh aa hoặc thủ công.


0

Hehe (chưa được kiểm tra và có phần lịch sự!):

$ cat /usr/local/bin/saferm

#! /bin/bash

/bin/ls -- "$@"

echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"

read userresponse

if [ "$userresponse" -eq "y" ]; then

  echo "Executing...."
  /bin/rm -- "$@"

fi

Và sau đó:

alias rm="/usr/local/bin/saferm"

Trên thực tế, bạn nên tạm dừng tinh thần trước khi thực hiện loại hoạt động đó với toàn cầu, cho dù bạn đang chạy bằng root, chuẩn bị "sudo" cho nó, v.v. Bạn có thể chạy "ls" trên cùng một quả cầu, v.v., nhưng, về mặt tinh thần, bạn nên dừng lại một chút, đảm bảo bạn đã gõ những gì bạn muốn, đảm bảo những gì bạn muốn thực sự là những gì bạn muốn, v.v ... Tôi cho rằng đây là thứ chủ yếu học được bằng cách phá hủy thứ gì đó trong năm đầu tiên như một Unix SA, giống như cách mà người đốt nóng là một giáo viên giỏi trong việc nói với bạn rằng một cái gì đó trên bếp có thể nóng.

Và chắc chắn rằng bạn có bản sao lưu tốt!


Tôi đã thử suy nghĩ hai lần trước khi làm những việc nguy hiểm, nhưng bằng cách nào đó nó không luôn hoạt động, tôi đã phá hủy mọi thứ trong quá khứ vì sự vô tâm như thế này.
Valentin Nemcev

0

Ngoài ra, không phải là một biện pháp bảo vệ, mà là một cách để tìm hiểu những tập tin nào đã bị xóa trước khi bạn nhấn ^ C, bạn có thể sử dụng locatecơ sở dữ liệu (tất nhiên chỉ khi nó được cài đặt và tồn tại rm)

Tôi đã tìm hiểu về nó từ bài viết trên blog này


0

Chỉ cần sử dụng ZFS để lưu trữ các tệp bạn cần để chống lại việc xóa ngẫu nhiên và có một trình nền:

  • thường xuyên thực hiện các ảnh chụp nhanh của hệ thống tập tin này
  • loại bỏ các ảnh chụp nhanh cũ / không cần thiết.

Nếu các tệp bị xóa, ghi đè, bị hỏng, bất cứ điều gì, chỉ cần khôi phục hệ thống tệp của bạn thành một bản sao của ảnh chụp tốt cuối cùng và bạn đã hoàn tất.


0

không phải là một câu trả lời mà là một mẹo, tôi luôn rm (dir) -rfkhông rm -rf (dir)tức là: đừng đi hạt nhân cho đến giây phút cuối cùng có thể.

Nó giúp giảm thiểu các tình huống trong đó bạn mập ngón tay tên dir theo cách mà nó vẫn là một thao tác xóa hợp lệ, chẳng hạn như trượt và nhấn phím enter.


Thông minh, nhưng sẽ không hoạt động trên BSD rm, nơi các tùy chọn phải đến trước tên tệp.
Svenper

vâng tôi thấy rằng sử dụng táo gần đây. Cách khắc phục là cài đặt các công cụ gnu và đặt bí danh cho mọi thứ :) và / hoặc tốt nhất là ném quả táo vào thùng rác. :)
Sirex


1
nếu tôi được phép, tôi sẽ làm trong một nano giây. Đó là rác so với linux.
Sirex

0

Tôi nghĩ rằng đây là một mẹo phòng ngừa mạnh mẽ, với * phím tắt mở rộng trong shell:

Đầu tiên, gõ rm -rf *hoặc rm -rf your/path/*, KHÔNG gõ Enterkhóa. (tất nhiên, bạn nên có thói quen chăm sóc không nhấn Enter nhanh / vô tình khi sử dụng rm -rf)

Sau đó, nhấn Alt-Shift-8(tức là Alt-Shift-*) để mở rộng ký tự đại diện "*" trong bash. Điều này cũng tránh nhập lại lệnh "rm -rf *" khi điều hướng lịch sử.

Cuối cùng, sau khi kiểm tra việc mở rộng có các tệp / thư mục phù hợp, nhấn Enter.

Làm xong.


0

Trong trường hợp điều này giúp ai đó ngoài kia cho trường hợp của họ:

1. Sử dụng rmsafe:

Nó di chuyển các tập tin vào một thư mục "thùng rác" và bạn luôn có cơ hội mang chúng trở lại với một cách đơn giản mv:

$ rmsafe /path/to/important/files

Nguồn: https://github.com/pendashteh/rmsafe

2. Sử dụng safe:

Bạn có thể đặt bí danh để rmsử dụng an toàn:

$ alias rm="safe rm"

Bây giờ nếu bạn chạy, rm /*bạn sẽ nhận được phản hồi này:

$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]

và tôi tin rằng bạn sẽ không gõ y!

Nguồn: https://github.com/pendashteh/safe

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.