इस गुप्त बैश कमांड का क्या मतलब है?


23

मैं दुर्भावनापूर्ण आदेशों के बारे में उबंटू फोरम की चेतावनी पढ़ रहा था और इस दिलचस्प मणि को पाया:

:(){ :|:& };:

चेतावनी: उपरोक्त कोड आपकी मशीन को तब तक क्रैश कर देगा जब तक कि आपके पास सख्त खरीद सीमा नहीं है (जो कि आप शायद नहीं करते हैं) एक कठिन पुनरारंभ करने का संकेत देते हैं।

इस कोड को चलाने के समान समझें sudo rm -rf /

लेकिन इसका क्या मतलब है? यहां तक ​​कि अपने प्रोग्रामिंग अनुभव के साथ, मैंने कभी भी एक कमांड नहीं देखी है जो कि गुप्त भाषा है जो कि विधानसभा भाषा नहीं है।


16
एक अतिरिक्त बिंदु: यह वास्तव में इसके समान नहीं है sudo rm -rf /। वह आदेश आपकी सभी फ़ाइलों को हटा देता है; यह केवल आपकी मशीन के संसाधनों को तब तक रोकती है जब तक कि यह अनुपयोगी न हो जाए और आपको पुनः आरंभ करना पड़े।
jtbandes

@jtban: फिर इसे संपादित करें। कोड के दोनों टुकड़े हैं जो मैं "खतरनाक" को चलाने के लिए विचार करूंगा। हाँ sudo rm -rf /है और अधिक खतरनाक है, लेकिन मैंने देखा है लोगों को रिमोट सर्वर पर इस पर अमल "बस यह क्या किया देखना चाहता था" यदि आप एक कठिन समय एक नियंत्रण कक्ष के लिए उपयोग के बिना पुन: प्रारंभ हो जहां।
जोश के

7
इसका इमोशनल गर्भ: P
RCIX

ध्यान दें यह हो सकता है arbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_name। नाम :न केवल इस आदेश को छोटा और गूढ़ बनाता है, बल्कि एक :बिल्टिन को भी बदल देता है जो एक फ़ंक्शन में कुछ भी नहीं करता है जो बहुत कुछ करता है । यदि आप :(){ :|:& }किसी और के वातावरण में इसकी परिभाषा को छलनी करते हैं और इसे वहां रहने देते हैं, तो यह हड़ताल करेगा जब पीड़ित इसे कम से कम उम्मीद करता है
कामिल मैकियोरोस्की

जवाबों:


40

यह, जैसा कि आपने कहा, एक forkbomb। यह क्या करता है एक फ़ंक्शन को परिभाषित करता है, फिर इसे कॉल करें। फंक्शन को कहा जाता है :

चलो इसे नाम दें forkbombताकि हम बेहतर देख सकें कि क्या हो रहा है:

forkbomb(){ forkbomb|forkbomb& };forkbomb

जैसा कि आप देख सकते हैं, और शायद अपने प्रोग्रामिंग अनुभव से अनुमान लगाते हैं, पहला भाग फ़ंक्शन परिभाषा ( forkbomb(){ ... }) है, और बहुत अंतिम :वह जगह है जहां फ़ंक्शन को बुलाया जाता है ( ;बस बैश में बयानों को अलग करता है)।

अब, यह कार्य क्या करता है? यदि आप बैश से परिचित हैं, तो आपको पता होगा कि |चरित्र एक कमांड / प्रोग्राम के मानक आउटपुट को दूसरे के मानक इनपुट में पाइप करता है। तो मूल रूप से, फ़ंक्शन के दो उदाहरण :|:शुरू होता है (यह वह जगह है जहां यह "कांटे" है)।

और फिर जादू: &उन आदेशों को पृष्ठभूमि में रखता है, जो मूल कार्य को वापस करने की अनुमति देता है, जबकि प्रत्येक उदाहरण के लिए गायों की पृष्ठभूमि में गायों को घर आते हैं, इस प्रकार आपके सभी संसाधनों का उपयोग करते हैं और सिस्टम को नीचे ले जाते हैं (जब तक कि इसकी सीमा न हो उस पर लगाया गया)।


1
बहुत बढ़िया जवाब! मुझे नहीं पता था कि आप उपयोग कर सकते हैं: एक फ़ंक्शन नाम के रूप में। नाम बदलने में मदद करता है। 3 मिनट में स्वीकार करेंगे।
एलएलक्यू

1
+1 कूल ... शानदार व्याख्या। यह ओएस टास्कस्विच के लिए स्टैक ओवरफ्लो की तरह है। क्या यह वास्तव में कर्नेल को क्रैश कर देता है या क्या यह संसाधनों को तब तक खा जाता है जब तक कि यह उपयोग करने के लिए बहुत असहनीय न हो जाए?
इवान प्लाइस

मुझे नहीं लगता कि यह वास्तव में कर्नेल को क्रैश करता है, कम से कम सीधे नहीं। यह बस तेजी से और अधिक प्रक्रियाएँ बनाता रहता है, जिनमें से प्रत्येक सीपीयू और मेमोरी को लेता है, और प्रोसेसर के साथ उन सभी को संभालने की कोशिश करता है जो वास्तव में उपयोग करना असंभव हो जाता है। यह हो सकता है कि कर्नेल अंततः लोड के तहत क्रैश हो जाता है (मुझे यकीन नहीं है), लेकिन यह तब से पहले अनुपयोगी हो जाएगा।
jtbandes

3
फाइनल को समझाने के लिए मत भूलना :, जो वास्तव में फ़ंक्शन को निष्पादित करता है!
फॉशी जूल

@ घोषी: सोचा कि मैंने किया है, लेकिन मैं स्पष्ट करने के लिए संपादित करूँगा!
jtbandes

9

विकिपीडिया लेख Forkbomb से लिया गया :

:()      # define ':' -- whenever we say ':', do this:
{        # beginning of what to do when we say ':'
    :    # load another copy of the ':' function into memory...
    |    # ...and pipe its output to...
    :    # ...another copy of ':' function, which has to be loaded into memory
         # (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
    &    # disown the functions -- if the first ':' is killed,
         #     all of the functions that it has started should NOT be auto-killed
}        # end of what to do when we say ':'
;        # Having defined ':', we should now...
:        # ...call ':', initiating a chain-reaction: each ':' will start two more.

7

टूटा:

: () // Define ':' as a function. When you type ':' do the following
{
    : // Call ':' 
    | // Redirect output
    : // Into ':'
    & // Push process to the background
}; // End of ':' def
: // Now do ':'

बदलें :करने के लिए bombऔर तुम हो:

bomb(){ bomb|bomb& };bomb

यह वास्तव में बहुत सुंदर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.