คุณจะได้รับคำสั่ง 'rm -rf /' ไปไกลแค่ไหน?


200

rm -rf /ฉันมักจะสงสัยว่าไกลระบบจริงจะได้รับถ้าคุณเรียก ฉันสงสัยว่าระบบปฏิบัติการจะสามารถลบตัวเอง (?)

คำถามโบนัส : หลังจากดำเนินการคำสั่งแล้วจะrmถูกลบออกหรือไม่

ปรับปรุง: ฉันได้ทดสอบสิ่งนี้ในการแจกจ่ายยูนิกซ์หลักโดยใช้ VirtualBox และคำตอบนั้นอธิบายสิ่งที่เกิดขึ้นอย่างแน่นอน หากได้รับพารามิเตอร์ที่ถูกต้อง rm จะลบข้อมูลทางกายภาพทุกบิตบนแผ่นดิสก์ อย่างไรก็ตามฉันพบปัญหาเมื่อใช้ rm รุ่นอื่นที่ไม่ใช่ GNU ตัวอย่างเช่นฉันเชื่อว่า BusyBox มีเวอร์ชันเป็นของตัวเองและไม่อนุญาตให้คุณลบออกมากเท่าที่คุณจะทำได้

คำถามนี้เป็นคำถามที่ผู้ใช้ซูเปอร์ของสัปดาห์
อ่านบล็อกของวันที่ 7 กรกฎาคม 2011 สำหรับรายละเอียดเพิ่มเติมหรือส่งคำถามประจำสัปดาห์ของคุณเอง


8
มันตลกที่คุณถามคำถามนี้ ฉันเพิ่งจะตอบคำถาม rm-f อีกฟอรั่มและเริ่มจำบทความที่ฉันอ่านในขณะที่กลับ โชคดีที่ผมบันทึกไว้สำหรับเวลาเช่นนี้เรื่องสยองขวัญคลาสสิก Unixนอกจากความจริงที่ว่ามันน่าสนใจที่จะดูว่าห่างไกลมันจะไป ... ฉันคิดว่ามันเป็นบทความที่เขียนเป็นอย่างดีและเป็นอ่านโดยทั่วไปดี!
akseli

3
ฉันเพิ่งลองใช้งานsudo rm -rf /กับ tinycore / microcore linux และดูเหมือนว่าระบบปฏิบัติการจะป้องกันไดเรกทอรีต่างๆ (/ sys และอื่น ๆ ) ไม่ให้ถูกลบ
n0pe

47
ฉันลองrm -f /bin/rmอีกครั้ง น่าเสียดายที่มันใช้งานได้และฉันใช้เวลาหนึ่งชั่วโมงเพื่อรับเวอร์ชันrmด้านหลังที่ถูกต้องจาก GNU coreutils
squircle

17
เดี๋ยวก่อนฉันจะลอง ...
Martijn Courteaux

38
ฉันทำสิ่งนี้ที่ร้าน Apple ตลอดเวลา
eggie5

คำตอบ:


188

หากคุณได้รับrmจาก GNU coreutils (ส่วนใหญ่อาจเป็น Linux distro ปกติ) rm -rf /จะถูกปฏิเสธโดยการป้องกันในตัว (ตาม manpage และ Wikipedia ไม่ได้ลองเลย)

--no-preserve-rootคุณสามารถแทนที่การป้องกันนี้ด้วย rmจะลบทุกอย่างที่ทำได้โดยไม่หยุดหลังจากพยายามลบทุกไฟล์ แน่นอนว่ามันจะไม่ลบระบบไฟล์เสมือนเช่น/procและ/sysแต่ไม่เกี่ยวข้อง - มันจะลบทุกอย่างบนดิสก์ของคุณ

หลังจากคำสั่งเสร็จสิ้นดิสก์ของคุณจะถูกล้างข้อมูลรวมถึงระบบปฏิบัติการ เคอร์เนลและกระบวนการปัจจุบันจะทำงานต่อไปจากหน่วยความจำ แต่กระบวนการจำนวนมากจะตายเพราะจะไม่สามารถเข้าถึงไฟล์บางไฟล์ได้ ระบบปฏิบัติการจะไม่สามารถบู๊ตในครั้งต่อไป


67
สิ่งที่ฉันกำลังมองหา ตอนนี้ใช้พลังนี้เพื่อครองโลก
n0pe

34
+1 โดยเฉพาะสำหรับ--no-preserve-rootเพราะปกติแล้วจะไม่กล่าวถึง
Matěj G.

22
@ MaxMackie เป็นเรื่องที่น่าสังเกตว่าแฮ็กเกอร์พบว่าสิ่งนี้มีประโยชน์น้อยที่สุดสำหรับผู้ใช้ มันทำลายข้อมูลใด ๆ ที่สามารถนำมาใช้เพื่อผลประโยชน์เงินสดและป้องกันไม่ให้แฮกเกอร์ใช้ประโยชน์จากเครื่องเพิ่มเติม เหมือนแมวที่มีแมลงคุณไม่ต้องการฆ่ามันคุณแค่อยากเล่นกับมันสักพักเพราะมันสนุก
zzzzBov

5
เพื่อตอบคำถามอื่น ๆ ของ OP ใช่ rm จะลบเอง เป็นไปได้ทั้งหมดที่จะแก้ไขหรือลบไฟล์ที่เรียกใช้งานได้แม้ในขณะที่มีอินสแตนซ์ของมันทำงาน มันจะยังคงทำงานต่อไปและจะไม่ได้รับผลกระทบจากการเปลี่ยนแปลง
thomasrutter

3
ฉันต้องการพูดถึง "ผู้ใช้ chmod -R: ผู้ใช้ *" ที่ / เนื่องจากเป็นความผิดพลาดแบบเรียกซ้ำและมีค่าใช้จ่าย ฉันทำครั้งเดียวและผ่านไปครึ่งทาง / ตามเวลาที่ฉันสามารถยกเลิกได้ / bin / boot / etc / dev เป็นเจ้าของ โชคดีที่เซิร์ฟเวอร์ยังคงทำงานในขณะที่ฉันใช้เวลาสองสามชั่วโมงถัดไปด้วยตนเองและรีเซ็ตเจ้าของจากระบบอ้างอิง อย่างไรก็ตามไม่มีใครสามารถใช้ su หรือ sudo ได้ในภายหลัง ในที่สุดค้นพบว่า / bin / su ไม่มี setuid bit set อีกต่อไป จดบันทึกในอนาคต: chowning / bin / su รีเซ็ต setuid bit!
Andy Lee Robinson


22

ตั้งค่า VM และลองเพื่อความสนุก?

มันจะไปไกล ... ถ้าคุณใช้กุยคุณอาจจะสนุกกับการสังเกตสิ่งต่าง ๆ ลดลงอย่างเห็นได้ชัด (ไอคอนบนเมนูหยุดโหลดเป็นต้น)

หากคุณปล่อยมันไประบบปฏิบัติการจะไม่สามารถกู้คืนได้แม้ว่าคุณจะสามารถกู้คืนข้อมูลได้อย่างง่ายดาย

ไม่ว่าจะด้วยวิธีใดคุณจะต้องทำการติดตั้งระบบปฏิบัติการใหม่


7
ฉันไม่ได้คิดเกี่ยวกับการลองใน VM จะลองตอนนี้! ooo นี่คือความสนุก
n0pe

40
เข้าใจผิดเขียนคำสั่งไปยังระบบโฮสต์ของเทอร์มิ
slhck

1
ลองดูบทความที่ฉันโพสต์ "เรื่องสยองขวัญคลาสสิค Unix!"
akseli

1
ตอนนี้ฉันกำลังทำงานอยู่และไม่มีเวลาที่จะทำการติดตั้ง distro ยอดนิยมเต็มรูปแบบ (ubuntu / slack / suse / fedora) หากใครก็ตามสามารถโคลนไฟล์ดิสก์ VM และลองให้กับเรามันจะยอดเยี่ยม
n0pe

2
ด้วย Amazon EC2 มันควรจะเป็นไฟไหม้อย่างรวดเร็วหนึ่งใน AMI ของพวกเขาที่ติดตั้งลินุกซ์แล้วและถูกไล่ออก ...
David d C e Freitas

11

ลองดูที่http://bellard.org/jslinux/สร้าง:

rm: ไม่สามารถลบ '/ dev / pts': อุปกรณ์หรือทรัพยากรไม่ว่าง
rm: ไม่สามารถลบ '/ dev': ไดเรกทอรีไม่ว่างเปล่า
rm: ไม่สามารถลบ '/ proc / swaps': การดำเนินการไม่ได้รับอนุญาต
rm: can 't remove' / proc / kallsyms ': ไม่อนุญาตให้ใช้งาน
rm: ไม่สามารถลบ' / proc / dma ': ไม่อนุญาตให้ใช้งาน

SNIP 881 รายการ

rm: ไม่สามารถลบ '/ proc / 149 / oom_adj': การอนุญาตถูกปฏิเสธ
rm: ไม่สามารถลบ '/ proc / 149': การดำเนินการไม่ได้รับอนุญาต
rm: ไม่สามารถลบ '/ proc': อุปกรณ์หรือทรัพยากรไม่ว่าง
rm: ไม่สามารถลบ '/ tmp': อุปกรณ์หรือทรัพยากรไม่ว่าง
rm: ไม่สามารถลบ '/': อุปกรณ์หรือทรัพยากรไม่ว่าง


1
ใช่ฉันได้รับข้อผิดพลาด / คำเตือนเหล่านั้นด้วย มาตรฐานนี้คุณคิดหรือไม่
n0pe

5
/ proc, / sys, บางครั้ง / dev, และจุดเชื่อมต่อใด ๆ เป็นคุณสมบัติของระบบปฏิบัติการและไม่สามารถลบได้
pjc50

1
เมื่อใช้ร่วมกับ @ pcj50 ไฟล์เหล่านั้นไม่ใช่ไฟล์บนฮาร์ดดิสก์ดังนั้น "การลบ" จึงไม่มีความหมาย
CarlF

7

ฉันจำได้ว่าสิ่งนี้ถูกเคี้ยวalt.sysadmin.recoveryย้อนหลังไปหลายวันเมื่อไม่มีสิ่งเช่น/procนั้นและ/devเป็นเพียงไดเรกทอรีปกติที่มีรายการสำหรับ inodes แปลก ๆ ...

... แต่ในบางรุ่นของ Unix (ความทรงจำของฉันคือ HP-UX แต่อาจผิดทั้งหมด) คุณไม่สามารถลบรายการไดเรกทอรีสุดท้ายสำหรับโปรแกรมที่กำลังทำงานอยู่ (ไลบรารีแบบแบ่งใช้มีอะไรบ้าง)

ในระบบเช่นถ้าคุณเริ่มต้นหนึ่งขึ้นในโหมดการบำรุงรักษา (ดังนั้นไม่มีอะไรทำงานอยู่ แต่เปลือกของคุณไม่ได้initและไม่มีระบบไฟล์รองถูกติดตั้ง) และไม่exec /bin/rm -rf /คุณจะถูกทิ้งไว้กับระบบแฟ้มรากหมดยกเว้นที่/binและ/bin/rmจะ อยู่รอด.

พลเมืองของอารามปีศาจที่น่ากลัวถือว่านี่เหมาะสมและเหมาะสม


4

rm -rf / ไม่ควรได้รับอนุญาตในการนำไปใช้งานล่าสุดเนื่องจากมีการแนะนำว่าเป็นการละเมิดมาตรฐาน POSIX:

" rm -rf /การป้องกัน" ใน Oracle บล็อก

อย่างไรก็ตามในตอนท้ายเราได้ทำการปรับเปลี่ยนข้อมูลจำเพาะและ Solaris 10 มี (ตั้งแต่สร้าง 36) รุ่นของ / usr / bin / rm (/ bin เป็น sym-link ไปยัง / usr / bin บน Solaris) และ / usr / xpg4 / bin / rm ซึ่งมีพฤติกรรมดังนี้:

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

2
"ชี้ให้เห็นว่าหากมีความพยายามที่จะลบ" / "ซ้ำแล้วซ้ำอีกในที่สุดจะพยายามลบ" .. "และ". "และสิ่งที่เรากำลังทำคือการอนุญาตให้ rm เพื่อกำหนด heuristically นี้น่าแปลกใจพวกเขาซื้อ ! "- เอ่อจะไม่อนุญาตให้ลบไดเรกทอรีใด ๆ ข้อมูลจำเพาะที่แท้จริงไม่อนุญาตเฉพาะ .. และ ในอาร์กิวเมนต์บรรทัดคำสั่งจริงมันไม่ได้พูดอะไรเกี่ยวกับสิ่งที่คุณ "ในที่สุดพยายามที่จะลบ"
Random832

1
เหตุใดจึงไม่อนุญาตให้ลบไดเรกทอรีใด ๆ ไดเรกทอรีรากเป็นสิ่งเดียวที่เกี่ยวข้องที่นี่และการลบมันชัดแจ้งถึงการลบ "." และ ".. " ไม่ว่าไดเรกทอรีปัจจุบันคืออะไร สามัญสำนึกไม่ได้ถูกห้ามในการตีความมาตรฐาน
jlliagre

1
บรรทัดของการโต้แย้งนั้นเป็นอัจฉริยะบริสุทธิ์
Nate CK

มาตรฐานระบุว่า rm ไม่ได้รับอนุญาตให้ดำเนินการต่อหากอาร์กิวเมนต์มีสตริง "" หรือ ".. " เป็นองค์ประกอบของชื่อไฟล์ คุณไม่สามารถลบแม้ว่าคุณจะไม่ได้อยู่ใน/foo/.. /fooไม่ได้ระบุว่าคุณไม่ได้รับอนุญาตให้ลบไดเรกทอรีปัจจุบัน (เช่นrm -r `pwd`) หรือพาเรนต์ของไดเรกทอรีปัจจุบัน
Random832

2
อันที่จริงฉันเข้าใจผิดแล้วและคุณถูกต้อง หวังว่าคนมาตรฐานยอมรับพฤติกรรมที่ชาญฉลาดว่าเป็นไปตามมาตรฐาน การลบชิ้นส่วนขนาดใหญ่หากระบบไฟล์ทั้งหมดไม่สามารถทำให้ระบบปฏิบัติการไม่เป็นไปตามมาตรฐานได้อย่างรวดเร็ว
jlliagre

3

จุดหนึ่งที่ฉันไม่ได้เห็นจากคนอื่น: ไฟล์ที่เปิดอยู่ในขณะนี้ (เช่นตัวเอง rm) แม้ว่าถูกลบไปแล้วจะไม่หายไปจากไดรฟ์จนกว่าจะปิด


ถูกต้องเพราะพวกมันถูกโหลดในหน่วยความจำใช่ไหม
n0pe

ฉันไม่แน่ใจว่าจะถือว่าปลอดภัยหรือไม่ เคอร์เนลสามารถโหลดไฟล์ที่ถูกลบไปไว้ในหน่วยความจำได้ดีและนำมันลงบนดิสก์ทันทีและเก็บสำเนาในหน่วยความจำนี้ไว้จนกว่าไฟล์จะเปิดขึ้น (เช่นจนกระทั่ง rm ทำงาน)
Ambroz Bizjak

ฉันไม่ได้คาดเดา หากโปรแกรมกำลังทำงานอยู่การลบมันจะไม่ลบโปรแกรมนั้นในกล่อง Linux อย่างน้อยที่สุด (ใจคุณฉันไม่ได้ทดสอบสิ่งนี้ในโอ้สองสามปี.)
CarlF

4
rm จะลบตัวเองออกจาก fs - โปรแกรมโหลดอย่างสมบูรณ์ในหน่วยความจำไม่ใช่ไฟล์
วอร์เรน

4
@ MaxMackie: ไม่ได้เพราะพวกเขากำลังโหลดในหน่วยความจำ แต่เนื่องจากการอ้างอิงไฟล์ที่เปิดมีพลังงานเช่นเดียวกับฮาร์ดลิงก์ (เช่นถ้าไฟล์มีฮาร์ดลิงก์อย่างน้อยหนึ่งลิงก์จะไม่ถูกลบออกจากดิสก์)
โกหก Ryan

1

สำหรับการลองครั้งเดียว (บนเซิร์ฟเวอร์ว่าสิ่งที่ทำให้ฉันโกรธ), บันทึกเป็น root ในเทอร์มินัลคุณจะสูญเสียเกือบทุกอย่าง สิ่งเดียวที่จะไม่ถูกลบจะเป็นเพียงกระบวนการที่จำเป็นสำหรับระบบปฏิบัติการ


12
"[ไม่ถูกลบ] เฉพาะกระบวนการที่จำเป็นสำหรับระบบปฏิบัติการ" - โอ้ไม่ต้องกังวล ซึ่งแตกต่างจาก Windows, Linux จะลบอะไรอย่างมีความสุขแม้ว่าไฟล์นั้นสำคัญกับระบบปฏิบัติการและในการใช้งาน /boot, /sbin, /etc, /bin, /vmlinuz? แบมไปแล้ว ขอให้โชคดีในการบูทโดยปราศจากสิ่งเหล่านั้น - ในความเป็นจริงโชคดีที่ทำสิ่งใด ๆเมื่อการลบเสร็จสิ้น
Piskvor

หากฉันจำได้ว่ามีไฟล์บางไฟล์ที่ไม่ถูกลบและฉันปล่อยให้ linux ทำงานนานกว่า 4 ชั่วโมง แต่ก็ยังดีที่รู้ว่าเกิดอะไรขึ้นเช่นทำ chmod 777 / * -fR;)
Anarko_Bizounours

3
"chmod 777 / * -fR" - นั่นควรทำให้ระบบไม่ปลอดภัยมากแม้ว่าจะเป็นมิตรกับผู้ใช้
Bart van Heukelom

1
@BartvanHeukelom เครื่องมือบางอย่างจะทำการทดสอบตัวเองอย่างรวดเร็วหรือถูกทดสอบโดยระบบเพื่อการเป็นเจ้าของและสิทธิ์ที่เหมาะสมและปฏิเสธที่จะดำเนินการหากกำหนดค่าไม่ได้
killermist

1
chmod -fR 777 /เป็นอันตรายเนื่องจากปิดบิต setuid และ setgid
G-Man

1

ไกลแค่ไหนที่คุณจะได้รับมันขึ้นอยู่กับการกระจาย Unix / Linux ที่เฉพาะเจาะจง

แต่เพื่อตอบคำถามฐานของคุณใช่ - rmคำสั่งจะถูกลบด้วยเช่นเดียวกับคำสั่งมาตรฐานอื่น ๆ ใน/binและโฟลเดอร์อื่น ๆ

นี่คือการทดสอบอย่างง่ายที่ฉันทำใน Linux Ubuntu 15.04 โดยใช้ VM

  1. เตรียมใช้งานเครื่องเสมือนผ่านvagrant:

    vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
    
  2. จากนั้นเมื่อคุณพยายามลบไฟล์ทั้งหมดด้วยวิธีมาตรฐานมันจะไม่ช่วยให้คุณ:

    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. --no-preserve-rootเพื่อช่วยให้ลอง ตรวจสอบอีกครั้งว่าคุณลงชื่อเข้าใช้ในเครื่องเสมือน (ดังนั้นคุณมีvagrant@vagrant-ubuntu-vivid-64:~$) จากนั้นเรียกใช้ (อย่าลองใช้ที่บ้าน):

    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
    

    หลังจากนั้นมันกลับไปที่ shell prompt เหมือนไม่มีอะไรเกิดขึ้น แต่คุณไม่สามารถรันคำสั่งใด ๆ อีกต่อไปนอกเหนือจากการมีอยู่แล้วภายในไม่กี่ตัวและkillเพื่อให้คุณสามารถทำงานให้เสร็จและฆ่าเซสชัน :)

    ตัวอย่างเช่น:

    $ 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.
    

ดังนั้นมันออกทุกอย่างรวมถึงสวยrm, lsและคำสั่งอื่น ๆ ทั้งหมด แต่ยังคงคุณเข้าสู่ระบบใน มีบางโฟลเดอร์พิเศษซึ่งไม่ถูกเอาออกเช่นอุปกรณ์จากการมี/dev, /procหรือ/sysที่ไม่ได้ไดเรกทอรีปกติ / ไฟล์ แต่มันก็เป็นระบบแฟ้มหลอกให้อินเตอร์เฟซในการประมวลผลและข้อมูลเคอร์เนล

หากคุณไม่ได้มีคนจรจัดหรือ Linux คุณสามารถเล่นกับบางJavaScript ลินุกซ์ x86 เลียนแบบ

หากคุณสนใจในความเป็นไปได้ของการกู้คืนจากภัยพิบัติดังกล่าวให้ตรวจสอบ:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.