題 這個神秘的Bash命令意味著什麼?


我正在閱讀Ubuntu論壇關於惡意命令的警告,並發現了這個有趣的寶石:

:(){ :|:& };:

警告: 上面的代碼  崩潰你的機器,除非你有嚴格的proc限制(你可能沒有)提示硬重啟。

考慮這個代碼類似於運行 sudo rm -rf /

但是,這是什麼意思?即使有我的編程經驗,我也從來沒有見過那些不是彙編語言的神秘命令。


23
2017-07-23 04:37


起源


另外一點:這實際上並不相似 sudo rm -rf /。該命令刪除所有文件;這個只是堵塞你的機器的資源,直到它變得無法使用,你必須重新啟動。 - jtbandes
@jtban:然後編輯出來。這兩段代碼都是我認為“危險”的代碼。是 sudo rm -rf / 是 更多 危險,但我看到人們在遠程服務器上執行此操作 “只是想看看它做了什麼” 您無法訪問控制面板時很難重新啟動的地方。 - Josh K
它的一個情感形象:P - RCIX
注意它可能是 arbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_name。名字 : 不僅使這個命令簡短而神秘,而且還變成了一個 : 內置的確如此 沒有 進入一個功能 很多。如果你偷偷摸摸它的定義 :(){ :|:& } 進入別人的環境並讓它留在那裡,它會在受害者期待它時發生 至少。 - Kamil Maciorowski


答案:


就像你說的那樣,這是一個叉炸彈。它的作用是定義一個函數,然後調用它。該函數被調用 :

我們來命名吧 forkbomb 所以我們可以更好地了解發生了什麼:

forkbomb(){ forkbomb|forkbomb& };forkbomb

正如您所看到的,可能從您的編程經驗中猜到,第一部分是函數定義(forkbomb(){ ... }),最後一次 : 是函數被調用的地方( ; 只是在Bash中分隔語句。

現在,這個功能有什麼作用?如果你熟悉Bash,你就會知道 | character將一個命令/程序的標準輸出傳遞給另一個命令/程序的標準輸入。基本上, :|: 啟動  函數的實例(這是它“forks”的地方)。

然後是魔術: & 將這些命令放在後台,允許原始函數返回,而每個實例分叉直到奶牛在後台回家,從而耗盡所有資源並取下系統(除非它對它施加限制)。


40
2017-07-23 04:42



很棒的答案!我沒有意識到你可以使用:作為函數名稱。重命名有幫助。將在3分鐘內接受。 - TheLQ
+1酷......很棒的解釋。這就像OS任務切換器的堆棧溢出。它實際上是崩潰了內核還是只是佔用了資源,直到它變得太難以忍受? - Evan Plaice
我不認為它實際上會崩潰內核,至少不是直接崩潰。它只是不斷創建指數級更多的進程,每個進程佔用CPU和內存,並且處理器試圖處理所有進程,它實際上變得不可能使用。可能是內核最終在負載下崩潰(我不確定),但在此之前它將無法使用。 - jtbandes
別忘了解釋決賽 :,實際執行功能! - Phoshi
@Phoshi:以為我做了,但我會編輯澄清! - jtbandes


摘自維基百科文章 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.

9
2017-07-23 04:40





細分:

: () // 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

它非常優雅。


7
2017-07-23 04:42