Bạn sẽ nhận được bao xa với lệnh 'rm -rf /'?


200

Tôi thường tự hỏi hệ thống sẽ thực sự đi được bao xa nếu bạn chạy rm -rf /. Tôi nghi ngờ HĐH sẽ có thể tự xóa (?)

Câu hỏi thưởng : Sau khi lệnh đã được thực thi, sẽ rmtự xóa?

Cập nhật: Tôi đã thử nghiệm điều này trong một vài bản phân phối unix chính bằng VirtualBox và các câu trả lời mô tả chính xác những gì xảy ra. Nếu được cung cấp các tham số chính xác, rm sẽ loại bỏ mọi bit dữ liệu vật lý trên đĩa. Tuy nhiên, tôi gặp phải một số vấn đề khi sử dụng phiên bản rm khác với phiên bản GNU. Ví dụ: tôi tin BusyBox có phiên bản của riêng họ và nó không cho phép bạn loại bỏ nhiều nhất có thể.

Câu hỏi này là một câu hỏi siêu người dùng trong tuần .
Đọc mục blog ngày 7 tháng 7 năm 2011 để biết thêm chi tiết hoặc gửi Câu hỏi của riêng bạn trong tuần.


8
Thật buồn cười khi bạn hỏi câu hỏi này. Tôi vừa trả lời một câu hỏi rm -f khác trên một diễn đàn khác và bắt đầu nhớ một bài báo tôi đọc được một lúc trước. May mắn là tôi đã lưu nó cho lần như thế này: THE câu chuyện kinh dị cổ điển Unix Bên cạnh thực tế là nó là thú vị để xem làm thế nào đến nay nó sẽ đi ... Tôi nghĩ đó là một bài viết rất tốt bằng văn bản và là một đọc chung là tốt!
akseli

3
Tôi vừa thử sudo rm -rf /trên linux tinycore / microcore và có vẻ như HĐH bảo vệ một số thư mục (/ sys và các thư mục khác) khỏi bị xóa.
n0pe

47
Tôi đã thử rm -f /bin/rmmột lần. Thật không may, nó đã hoạt động và tôi đã dành một giờ tiếp theo để lấy lại phiên bản chính xác rmtừ lõi core GNU.
vòng tròn

17
Đợi một chút, tôi sẽ thử ...
Martijn Courteaux

38
Tôi làm điều này tại cửa hàng táo mọi lúc
eggie5

Câu trả lời:


188

Nếu bạn có rmtừ GNU coreutils (rất có thể nếu đó là bản phân phối Linux thông thường), rm -rf /sẽ bị từ chối bởi bảo vệ tích hợp (theo manpage và Wikipedia, đã không thử điều đó).

Bạn có thể ghi đè bảo vệ này với --no-preserve-root. rmsau đó sẽ xóa mọi thứ có thể, mà không dừng lại sau khi đã cố xóa mọi tệp đơn lẻ. Tất nhiên, nó sẽ không xóa các hệ thống tệp ảo như /proc/sys, nhưng điều đó không liên quan - nó sẽ xóa mọi thứ trên đĩa của bạn.

Sau khi lệnh kết thúc, đĩa của bạn sẽ bị xóa sạch, bao gồm cả hệ điều hành. Hạt nhân và các quy trình hiện tại sẽ tiếp tục chạy từ bộ nhớ, nhưng nhiều quy trình sẽ chết vì chúng sẽ không truy cập được vào một số tệp. HĐH sẽ không khởi động được vào lần tới.


67
Chính xác những gì tôi đang tìm kiếm. Bây giờ để sử dụng sức mạnh này để đi qua thế giới.
n0pe

34
+1 đặc biệt --no-preserve-rootvì điều đó thường không được đề cập.
Matěj G.

22
@MaxMackie, đáng chú ý là các tin tặc rất nhanh chóng nhận thấy đây là điều ít hữu ích nhất mà chúng có thể làm với người dùng. Nó phá hủy mọi dữ liệu có thể được sử dụng để kiếm tiền và ngăn chặn tin tặc tiếp tục khai thác máy. Giống như một con mèo với một con côn trùng, bạn không muốn giết nó, bạn chỉ muốn chơi với nó một lúc bởi vì nó rất vui.
zzzzBov

5
Để trả lời câu hỏi khác của OP, có rm sẽ tự xóa. Hoàn toàn có thể sửa đổi hoặc xóa một tệp thực thi ngay cả khi có một phiên bản của nó đang chạy. Nó cũng sẽ tiếp tục chạy, và sẽ không bị ảnh hưởng bởi sự thay đổi.
thomasrutter

3
Tôi muốn đề cập đến "chmod -R user: user *" tại /, bởi vì đó cũng là một lỗi đệ quy và tốn kém. Tôi đã làm điều đó một lần và đã đi được nửa đường / về nhà khi tôi có thể phá thai. / bin / boot / etc / dev đã được sở hữu. May mắn là máy chủ tiếp tục chạy trong khi tôi dành vài giờ tiếp theo bằng tay và đặt lại quyền sở hữu từ một hệ thống tham chiếu. Tuy nhiên, không ai khác có thể sử dụng su hoặc sudo sau đó. Cuối cùng phát hiện ra rằng / bin / su không còn được thiết lập bit setuid. Hãy lưu ý cho tương lai: chowning / bin / su đặt lại bit setuid của nó!
Andy Lee Robinson

42

Dành cho những người thích làm những thứ như thế này một cách trực quan trong khi nghe nhạc techno.

Chạy rm-rf trên Linux (video)

Điểm thưởng nếu bạn có thể đặt tên cho các quy trình khi chúng bắt đầu chết.


22

Thiết lập VM và thử cho vui?

Nó sẽ đi khá xa ... nếu bạn đang sử dụng một gui, bạn có thể thấy vui khi nhận thấy mọi thứ xuống cấp rõ ràng hơn. (các biểu tượng trên menu dừng tải, v.v.)

Nếu bạn để nó đi, hệ điều hành sẽ vượt quá khả năng phục hồi mặc dù bạn có thể lấy lại một số dữ liệu một cách dễ dàng.

Dù bằng cách nào, bạn sẽ muốn cài đặt lại HĐH.


7
Tôi thậm chí không nghĩ về việc thử nó trong VM. Đi để thử ngay bây giờ! ooo đây là niềm vui.
n0pe

40
Viết nhầm lệnh vào Terminal của hệ thống máy chủ
slhck

1
Kiểm tra bài viết tôi đã đăng. "Câu chuyện kinh dị Unix cổ điển!"
akseli

1
Tôi đang làm việc ngay bây giờ và không có thời gian để cài đặt đầy đủ một bản phân phối phổ biến (ubfox / slack / suse / fedora). Nếu bất cứ ai khác có thể sao chép một tệp đĩa VM và thử nó cho chúng tôi, nó sẽ rất tuyệt.
n0pe

2
Với Amazon EC2, bạn nên nhanh chóng kích hoạt một trong những AMI của họ đã cài đặt linux và khởi động ...
David d C e Freitas

11

Chà, thử nó trên http://bellard.org/jslinux/ tạo ra:

rm: không thể xóa '/ dev / pts': Thiết bị hoặc tài nguyên bận
rm: không thể xóa '/ dev': Thư mục không trống
rm: không thể xóa '/ Proc / hoán đổi': Hoạt động không được phép
rm: can 't remove' / Proc / kallsyms ': Thao tác không được phép
rm: không thể xóa' / Proc / dma ': Thao tác không được phép

SNIP 881 mục

rm: không thể xóa '/ Proc / 149 / oom_adj': Quyền bị từ chối
rm: không thể xóa '/ Proc / 149': Thao tác không được phép
rm: không thể xóa '/ Proc': Thiết bị hoặc tài nguyên bận
rm: không thể xóa '/ tmp': Thiết bị hoặc tài nguyên bận
rm: không thể xóa '/': Thiết bị hoặc tài nguyên bận


1
Vâng, tôi cũng nhận được những lỗi / cảnh báo. Đây có phải là tiêu chuẩn bạn nghĩ?
n0pe

5
/ Proc, / sys, đôi khi / dev và bất kỳ điểm gắn kết nào là thuộc tính của hệ điều hành và không thể bị xóa.
pjc50

1
Đồng tình với @ pcj50, những tệp này không phải là tệp trên đĩa cứng, vì vậy "xóa" chúng là không có ý nghĩa.
CarlF

7

Tôi nhớ lại điều này đã được nhai alt.sysadmin.recoverylại sau nhiều ngày, khi không có thứ gì như vậy /proc, và /devchỉ là một thư mục thông thường chứa các mục cho một loạt các nút bất thường ...

... nhưng, trên một số biến thể của Unix (hồi ức của tôi là HP-UX, nhưng điều đó có thể hoàn toàn sai), bạn không thể xóa mục nhập thư mục cuối cùng cho một chương trình đang chạy. (Thư viện dùng chung? Đó là những gì?)

Trên các hệ thống như vậy, nếu bạn bắt đầu lên trong chế độ bảo trì (vì vậy không có gì đang chạy nhưng vỏ của mình, thậm chí không init, và không có hệ thống tập tin thứ cấp được gắn) và đã exec /bin/rm -rf /, bạn sẽ bị bỏ lại với một hệ thống tập tin gốc hoàn toàn trống rỗng , ngoại trừ rằng /bin/bin/rmsẽ tồn tại

Những người từ chối tu viện ma quỷ đáng sợ coi điều này là phù hợp và đúng đắn.


4

rm -rf / không được phép thực hiện gần đây vì nó đã được đề xuất vì nó vi phạm tiêu chuẩn POSIX:

" rm -rf /" bảo vệ trên blog của Oracle

Dù sao, cuối cùng, chúng tôi đã sửa đổi thông số kỹ thuật và Solaris 10 đã (kể từ bản dựng 36) một phiên bản / usr / bin / rm (/ bin là một liên kết sym đến / usr / bin trên Solaris) và / usr / xpg4 / bin / rm hoạt động như vậy:

[28] /bin/rm -rf /
rm of / is not allowed
[29] 

2
"chỉ ra rằng nếu một người cố gắng loại bỏ" / "một cách đệ quy, cuối cùng người ta sẽ cố gắng loại bỏ" .. "và". ", và tất cả những gì chúng ta đang làm là cho phép rm xác định trước điều này theo cách heuristic. ! "- er, điều đó có không cho phép xóa bất kỳ thư mục nào không? Thông số kỹ thuật thực tế chỉ không cho phép .. và. trong các đối số dòng lệnh thực tế, nó không nói bất cứ điều gì về những gì bạn "cuối cùng cố gắng loại bỏ"
Random832

1
Tại sao nó không cho phép loại bỏ bất kỳ thư mục? Thư mục gốc là mối quan tâm duy nhất ở đây và loại bỏ nó rõ ràng ngụ ý loại bỏ "." và "..", bất kể thư mục hiện tại là gì. Ý thức thông thường không bị cấm trong giải thích tiêu chuẩn.
jlliagre

1
Dòng lập luận đó là thiên tài thuần túy.
Nate CK

Tiêu chuẩn xác định rằng rm không được phép tiếp tục nếu một đối số có chuỗi "." hoặc ".." là thành phần tên cơ sở. Bạn không thể xóa /foo/..ngay cả khi bạn không ở trong /foo. Nó không xác định rằng bạn không được phép xóa thư mục hiện tại (ví dụ rm -r `pwd`) hoặc cha mẹ của thư mục hiện tại.
Random832

2
Thật vậy, tôi đã hiểu nhầm tuyên bố và bạn là chính xác. Hy vọng rằng, những kẻ tiêu chuẩn chấp nhận hành vi thông minh hơn là tuân thủ tiêu chuẩn. Loại bỏ các phần lớn nếu không phải tất cả các hệ thống tệp sẽ nhanh chóng làm cho hệ điều hành không tuân thủ tiêu chuẩn.
jlliagre

3

Một điểm tôi không thấy được thực hiện bởi bất kỳ ai khác: các tệp hiện đang mở (ví dụ: rm chính nó), ngay cả khi bị xóa, sẽ không thực sự biến mất ổ đĩa cho đến khi đóng.


Điều đó đúng, bởi vì chúng được tải trong bộ nhớ phải không?
n0pe

Tôi không chắc chắn nếu điều đó là an toàn để giả định; hạt nhân rất có thể chỉ cần tải tệp đã xóa vào bộ nhớ và xóa nó ngay trên đĩa và giữ bản sao trong bộ nhớ này cho đến khi tệp được mở (ví dụ cho đến khi rm chạy).
Ambroz Bizjak

Tôi không suy đoán. Nếu một chương trình đang chạy, ít nhất thì việc xóa nó sẽ không xóa nó trên các hộp Linux của tôi. (Hãy nhớ rằng tôi đã không thử nghiệm điều này trong, ồ, một vài năm.)
CarlF

4
rm sẽ tự xóa khỏi fs - chương trình được tải hoàn toàn trong bộ nhớ, không phải tệp
warren

4
@MaxMackie: không phải vì chúng được tải trong bộ nhớ mà vì tham chiếu tệp mở có cùng sức mạnh với liên kết cứng (nghĩa là nếu một tệp có ít nhất một liên kết cứng, nó sẽ không bị xóa khỏi đĩa).
Nói dối Ryan

1

Vì đã thử nó một lần (trên một máy chủ khiến tôi bực mình), đăng nhập với quyền root, trong terminal, bạn sẽ mất gần như mọi thứ. Điều duy nhất sẽ không bị xóa sẽ chỉ là quá trình cần thiết cho HĐH.


12
"[không bị xóa] chỉ quá trình cần thiết cho HĐH" - ồ, đừng lo lắng. Không giống như Windows, Linux sẽ vui vẻ xóa mọi thứ, ngay cả khi tệp quan trọng đối với hệ điều hành đang sử dụng. /boot, /sbin, /etc, /bin, /vmlinuz? Bam, đi rồi. Chúc may mắn khởi động mà không cần những thứ đó - trên thực tế, chúc may mắn làm bất cứ điều gì sau khi xóa xong.
Piskvor

Nếu tôi nhớ có một số tệp chưa bị xóa và tôi để linux của tôi chạy hơn 4 giờ. Tuy nhiên, thật tốt khi biết điều gì xảy ra, như thực hiện một chmod 777 / * -fR;)
Anarko_Bizounours

3
"chmod 777 / * -fR" - Điều đó sẽ khiến hệ thống rất không an toàn, mặc dù rất thân thiện với người dùng.
Bart van Heukelom

1
@BartvanHeukelom, một số công cụ sẽ thực hiện tự kiểm tra nhanh hoặc được hệ thống kiểm tra quyền sở hữu và quyền thích hợp và từ chối hành động nếu bị cấu hình sai.
killermist

1
chmod -fR 777 /là có hại vì nó tắt các bit setuid và setgid.
G-Man

1

Bạn có thể nhận được bao xa, về cơ bản phụ thuộc vào các bản phân phối Unix / Linux cụ thể.

Nhưng để trả lời câu hỏi cơ bản của bạn, có - rmlệnh sẽ bị xóa cùng với nó cũng như bất kỳ lệnh tiêu chuẩn nào khác trong /binvà các thư mục khác.

Đây là bài kiểm tra đơn giản mà tôi đã thực hiện trong Linux Ubuntu 15.04 bằng VM.

  1. Khởi tạo máy ảo thông qua vagrant:

    vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
    
  2. Sau đó, khi bạn đang cố xóa tất cả các tệp theo cách tiêu chuẩn, nó không cho phép bạn:

    vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -fr /
    rm: it is dangerous to operate recursively on '/'
    rm: use --no-preserve-root to override this failsafe
    
  3. Vậy hãy thử xem --no-preserve-root. Luôn kiểm tra kỹ bạn đã đăng nhập vào máy ảo (vì vậy bạn đang có vagrant@vagrant-ubuntu-vivid-64:~$), sau đó chạy (không thử điều đó ở nhà):

    vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -vfr --no-preserve-root /
    removed directory: '/lost+found'
    removed directory: '/opt'
    removed '/bin/nc'
    removed '/bin/less'
    removed '/bin/wdctl'
    removed '/bin/nano'
    ...
    removed '/bin/rmdir'
    removed '/bin/sh'
    removed '/bin/rm'
    ...
    removed directory: '/bin'
    removed directory: '/usr/games'
    removed '/usr/bin/byobu-launcher-install'
    removed '/usr/bin/ipcmk'
    removed '/usr/bin/sum'
    removed directory: '/usr/bin'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9.2'
    removed '/usr/lib/gcc/x86_64-linux-gnu/5.0.1'
    removed directory: '/usr/lib/gcc/x86_64-linux-gnu/5'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libquadmath.so'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libgomp.so'
    ...
    removed directory: '/run/initramfs'
    removed directory: '/media'
    rm: cannot remove '/proc/fb': Operation not permitted
    rm: cannot remove '/proc/fs/ext4/sda1/options': Operation not permitted
    ...
    removed '/vmlinuz'
    removed '/boot/config-3.19.0-23-generic'
    removed '/boot/grub/grubenv'
    ...
    removed directory: '/boot'
    removed '/lib64/ld-linux-x86-64.so.2'
    rm: cannot remove '/dev/hugepages': Device or resource busy
    rm: cannot remove '/dev/mqueue': Device or resource busy
    rm: cannot remove '/dev/shm': Device or resource busy
    removed '/dev/vcsa7'
    ...
    removed '/dev/mem'
    removed '/dev/rfkill'
    removed '/dev/vga_arbiter'
    ...
    rm: cannot remove '/sys/fs/ecryptfs/version': Operation not permitted
    removed directory: '/etc'
    removed directory: '/mnt'
    removed '/vagrant/.vagrant/machines/default/virtualbox/action_provision'
    removed '/vagrant/.vagrant/machines/default/virtualbox/action_set_name'
    removed '/vagrant/.vagrant/machines/default/virtualbox/creator_uid'
    removed '/vagrant/.vagrant/machines/default/virtualbox/id'
    removed '/vagrant/.vagrant/machines/default/virtualbox/index_uuid'
    removed '/vagrant/.vagrant/machines/default/virtualbox/private_key'
    removed '/vagrant/.vagrant/machines/default/virtualbox/synced_folders'
    removed directory: '/vagrant/.vagrant/machines/default/virtualbox'
    removed directory: '/vagrant/.vagrant/machines/default'
    removed directory: '/vagrant/.vagrant/machines'
    removed directory: '/vagrant/.vagrant'
    removed '/vagrant/Vagrantfile'
    rm: cannot remove '/vagrant': Device or resource busy
    

    Sau đó, nó trở lại dấu nhắc shell như không có gì xảy ra, nhưng bạn không thể thực hiện bất kỳ lệnh nào nữa ngoài vài lệnh được tích hợp và killđể bạn có thể hoàn thành công việc của mình và giết phiên của mình :)

    Ví dụ:

    $ rm
    rm: command not found
    $ kill
    kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
    $ which kill
    -bash: /usr/bin/which: No such file or directory
    $ kill -9 $$
    Connection to 127.0.0.1 closed.
    

Vì vậy, nó khá loại bỏ tất cả mọi thứ, bao gồm cả rm, lsvà tất cả các lệnh khác, nhưng bạn vẫn đang đăng nhập. Có một số thư mục đặc biệt mà không phải đã được gỡ bỏ như một số thiết bị từ /dev, /prochoặc /sysđược không các thư mục thường xuyên / file, nhưng nó giả hệ thống tập tin cung cấp giao diện để xử lý và dữ liệu hạt nhân.

Nếu bạn không có Vagrant hoặc Linux, bạn có thể chơi với một số trình giả lập JavaScript Linux x86 .

Nếu bạn quan tâm đến khả năng phục hồi sau thảm họa đó, hãy kiểm tra:

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.