ทำไมคำสั่ง“: () {: |: &} ;:” ทำให้ระบบของฉันล้าช้าดังนั้นฉันจึงต้องรีบูต?


286

อันตราย!

ห้ามรันคำสั่งนี้เพื่อ 'ทดสอบ' ยกเว้นว่าคุณได้เตรียมไว้สำหรับความผิดพลาดและ / หรือบังคับให้รีบูตระบบของคุณ

ฉันอยู่ใน VirtualBox ของฉันที่ทำงานอยู่ 12.04 พยายามรวบรวมแอพและในขณะที่รอฉันเกิดขึ้นกับฟอรัมที่ความคิดเห็นกล่าวว่า:

ลอง:(){ :|: & };:
สนุกด้วยและไม่ต้องการรูท

ฉันวิ่งเข้าไปที่เทอร์มินอล gnome มันทำให้ 12.04 ของฉัน (ใน Virtualbox) ล่าช้ามากฉันต้องปิดตัวลง

คำถามของฉันคือคำสั่งนี้ทำอะไร

: () {: |: &} ;:



1
ดูหัวข้อเก่า: ubuntuforums.org/showthread.php?t=1392511
Paddy Landau


เป็นไปได้ที่ซ้ำกันข้ามไซต์ของ: stackoverflow.com/questions/515844/...
Ciro Santilli新疆改造中心法轮功六四事件

9
"ล้าช้ามาก" มองโลกในแง่ดี
pstadler

คำตอบ:


372

นี้เรียกว่าระเบิดส้อม

:() หมายถึงคุณกำลังกำหนดฟังก์ชั่นที่เรียกว่า :

{:|: &}หมายถึงเรียกใช้ฟังก์ชั่น:และส่งออกไปยัง:ฟังก์ชั่นอีกครั้งและเรียกใช้ในพื้นหลัง

;เป็นตัวคั่นคำสั่ง

: เรียกใช้ฟังก์ชันในครั้งแรก

โดยพื้นฐานแล้วคุณกำลังสร้างฟังก์ชั่นที่เรียกตัวเองว่าสองครั้งทุกการโทรและไม่มีทางที่จะยุติตัวเอง มันจะเพิ่มเป็นสองเท่าจนกว่าคุณจะหมดทรัพยากรระบบ

การใช้งาน VirtualBox นั้นสมเหตุสมผลดีไม่งั้นคุณจะต้องรีสตาร์ทเครื่องคอมพิวเตอร์ของคุณ


27
คำตอบนี้ดูเหมือนจะแนะนำว่าการรีบูตเป็นเพียงการขอความช่วยเหลือเท่านั้น แต่ในความเป็นจริงแล้ว fork fork นี้สามารถฆ่าได้โดยไม่ต้องรีบูตเครื่องและฉันสังเกตว่ามันไม่สามารถทำงานได้อย่างถูกต้องในบางระบบ
Konrad Rudolph

27
ที่จริงแล้วสำหรับคำอธิบายที่สมบูรณ์แล้วนี่น่า;จะเป็นตัวแยกคำสั่ง { ... }ส่วนหนึ่งเป็นเพียงเนื้อหาของฟังก์ชัน
CVn

@ MichaelKjörling +1 ฉันไม่เข้าใจไวยากรณ์จนกว่าจะคำนึงถึงความคิดเห็นของคุณ
jumpnett

1
@ SuperMatt ฉันไม่รู้ว่าคำถามนี้ยังทำงานอยู่หรือไม่ แต่ฉันก็อยากรู้ว่าต้องทำอะไร|และ&ทำอย่างไร ฉันเข้าใจว่าคุณได้ให้การทำงานของฟังก์ชั่น แต่ฉันต้องการที่จะรู้ว่าทั้งสองทำอะไร
Noober

1
@ ไม่มีใครรู้ถ้าคุณยังสงสัย (เช่นฉันในหลุมดำนี้ของเอกสารสั้นและเป็นความลับที่เป็นลินุกซ์) ฉันรู้! | เป็นไพพ์ที่ใส่หลังจากคำสั่งเพื่อส่งเอาต์พุตคำสั่งนั้นเป็นอินพุตไปยังคำสั่งที่ตามมา & เป็นทางแยกที่จะสร้างเธรดใหม่สำหรับคำสั่งก่อนหน้านี้ที่ปล่อยให้เธรดปัจจุบันเพื่อดำเนินการคำสั่งเพิ่มเติมต่อไป
flurbius

179

นี่คือfork fork ที่ถูกเรียกใช้ในเชลล์

จากวิกิพีเดีย:

:(){ :|:& };:
\_/| |||| ||\- ... the function ':', initiating a chain-reaction: each ':' will start    two more.
 | | |||| |\- Definition ends now, to be able to run ...
 | | |||| \- End of function-block
 | | |||\- disown the functions (make them a background process), so that the children    of a parent
 | | |||   will not be killed when the parent gets auto-killed
 | | ||\- ... another copy of the ':'-function, which has to be loaded into memory.
 | | ||   So, ':|:' simply loads two copies of the function, whenever ':' is called
 | | |\- ... and pipe its output to ...
 | | \- Load a copy of the function ':' into memory ...
 | \- Begin of function-definition
 \- Define the function ':' without any parameters '()' as follows:

3
แม้ว่าจะเป็นจุดสัมผัสและคำว่า 'disown' อาจมีมากเกินไป แต่ในทางเทคนิคแล้วกระบวนการที่ใส่เข้าไปในแบ็คกราวน์นั้นไม่ได้ถูกปฏิเสธและสามารถถูกนำไปที่พื้นหน้าด้วยคำสั่ง 'fg' และกระบวนการ (es) จะยุติหาก ผู้ใช้ล็อกเอาต์ (หากยังมีทรัพยากรที่พร้อมใช้งานเพื่อให้การล็อกเอาต์สำเร็จ) .... เว้นแต่และจนกว่าจะมีการเรียกใช้ 'ปฏิเสธ' ในกระบวนการหรือ jobid หลังจากนั้นจะถูกปฏิเสธจริง: การออกจากระบบจะไม่ยุติลงและ fg จะไม่มีผลใด ๆ
Rondo

1
แม้ว่ามันจะเป็นเพียงจุดเล็ก ๆ น้อย ๆ แต่เครื่องหมายวงเล็บไม่ได้หมายความว่าไม่มีพารามิเตอร์ในเชลล์เหมือน bash แต่เป็นเพียงการตกแต่งที่เหลือจากภาษาสไตล์ C เท่านั้น
Charlie Harding

75

คำสั่งนั้นเป็นเวอร์ชั่นที่รู้จักกันดีของfork fork

ส้อมระเบิดรูปจากวิกิพีเดีย

มันทำให้คอมพิวเตอร์ของคุณมีหน่วยความจำไม่เพียงพอโดยการทำกระบวนการอย่างไม่สิ้นสุด มีการป้องกันบางอย่างที่คุณสามารถใช้กับมันได้เช่นกัน:

โดยทั่วไปแล้วระบบชนิด Unix จะมีขีด จำกัด กระบวนการควบคุมโดยคำสั่ง ulimit shell หรือตัวสืบทอดของ setrlimit เคอร์เนล Linux ตั้งค่าและบังคับใช้ RLIMIT_NPROC rlimit ("ขีด จำกัด ทรัพยากร") ของกระบวนการ หากกระบวนการพยายามทำการแยกและผู้ใช้ที่เป็นเจ้าของกระบวนการนั้นมีกระบวนการอยู่RLIMIT_NPROCแล้วส้อมจะล้มเหลว นอกจากนี้บน Linux หรือ * BSD เราสามารถแก้ไขpam_limitsไฟล์ปรับแต่ง/etc/security/limits.confให้มีผลเหมือนกันได้ อย่างไรก็ตามลีนุกซ์บางรุ่นเท่านั้นที่มีการpam_limitsติดตั้งโมดูลไว้


18

ตามนี้ :(){ :|: & };:เรียกว่า

Forkbombเป็นผู้สร้างไวรัสบทกวี

... โปรแกรมเล็ก ๆ ที่น่ากลัวสั่งให้มันทำสำเนาหลาย ๆ ชุดของตัวเองออกจากปฏิกิริยาลูกโซ่และทำให้ทรัพยากรของระบบหมดไปอย่างรวดเร็ว ...

ดังนั้นจึงไม่ควรเรียกใช้สิ่งนี้อาจทำให้เกิดความเสียหายต่อฮาร์ดแวร์เนื่องจากทำให้เกิดการทำงานแบบวนรอบอาจทำให้เกิดความร้อนได้ง่ายในแล็ปท็อป

ลิงค์อื่นอธิบายผ่านภาพหน้าจอที่นี่


59
หาก fork bomb ทำให้ฮาร์ดแวร์เสียหายหมายความว่าคุณมีปัญหาที่ใหญ่และลึกกว่ามาก
CVn

38
บางทีเขากำลังพูดถึงระเบิดด้วยส้อมที่สามารถระเบิดได้ใกล้กับพีซีของคุณ?
dysoco

2
ลิงค์ของภาพหน้าจอเสีย
IMustBeSomeone

0

มันถูกเรียกว่า“ fork-bomb ” ตามที่อธิบายไว้ข้างต้นและอีกวิธีหนึ่งในการทำเช่นนี้คือใช้การประมวลผลเบื้องหลังแทนที่จะใช้ piping:

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