Shell腳本經(jīng)典之Fork炸彈的分析與預(yù)防
fork炸彈介紹
眾所周知,bash是一款極其強(qiáng)大的shell,提供了強(qiáng)大的交互與編程功能。這樣的一款shell中自然不會缺少函數(shù)這個元素來幫助程序進(jìn)行模塊化的高效開發(fā)與管理。于是產(chǎn)生了由于其特殊的特性,bash擁有了fork炸彈。Jaromil在2002年設(shè)計(jì)了最為精簡的一個fork炸彈的實(shí)現(xiàn)。
所謂fork炸彈是一種惡意程序,它的內(nèi)部是一個不斷在fork進(jìn)程的無限循環(huán),fork炸彈并不需要有特別的權(quán)限即可對系統(tǒng)造成破壞。fork炸彈實(shí)質(zhì)是一個簡單的遞歸程序。由于程序是遞歸的,如果沒有任何限制,這會導(dǎo)致這個簡單的程序迅速耗盡系統(tǒng)里面的所有資源。
現(xiàn)在來看看Jaromil設(shè)計(jì)的最簡單的fork炸彈
fork炸彈分析
:() { :|:& };:
一行看似無法理解的只有13個字符的命令,即可占用掉所有系統(tǒng)的資源。其實(shí),這行命令如果這樣寫成bash script就不難理解了
:() { :|:& } ; :
- 第 1 行 說明下面要定義一個函數(shù),函數(shù)名為小數(shù)點(diǎn),沒有可選參數(shù)。
- 第 2 行 表示函數(shù)體開始。
- 第 3 行 是函數(shù)體真正要做的事情,首先它遞歸調(diào)用本函數(shù),然后利用管道調(diào)用一個新進(jìn)程(它要做的事情也是遞歸調(diào)用本函數(shù)),并將其放到后臺執(zhí)行。
- 第 4 行 表示函數(shù)體結(jié)束。
- 第 5 行 并不會執(zhí)行什么操作,在命令行中用來分隔兩個命令用。從總體來看,它表明這段程序包含兩個部分,首先定義了一個函數(shù),然后調(diào)用這個函數(shù)。
- 第 6 行 表示調(diào)用本函數(shù)。
冒號”:”其實(shí)是函數(shù)名,這個bash腳本就是在不斷的執(zhí)行該函數(shù),然后不斷fork出新的進(jìn)程。
fork炸彈預(yù)防
那么,有沒有辦法扼制這種情況的發(fā)生呢?答案是肯定的,只需設(shè)置進(jìn)程的limit數(shù)即可。
$ ulimit -u 128 $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited max nice (-e) 20 file size (blocks, -f) unlimited pending signals (-i) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) unlimited max rt priority (-r) unlimited stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 128 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
在上面的例子中,我們將用戶可以創(chuàng)建的最大進(jìn)程數(shù)限制為 128,執(zhí)行fork炸彈會迅速fork出大量進(jìn)程,此后會由于資源不足而無法繼續(xù)執(zhí)行。使用工具ulimit即可設(shè)置各種限制數(shù),具體的請參考該工具的man或help。
fork 炸彈讓我們認(rèn)識到了遞歸函數(shù)的強(qiáng)大功能,同時(shí)也意識到一旦使用不當(dāng),遞歸函數(shù)所造成的破壞將是巨大的。實(shí)際上,fork 炸彈只是一個非常簡單的遞歸函數(shù),它并不涉及參數(shù)傳遞、返回值等問題,而這些問題在使用bash編程時(shí)是否有完善的支持呢?在bash中編寫遞歸函數(shù)時(shí)應(yīng)該注意相關(guān)問題。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Shell腳本經(jīng)典之Fork炸彈的分析與預(yù)防
這篇文章主要給大家介紹了Shell腳本經(jīng)典之Fork炸彈的分析與預(yù)防,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份
本文主要介紹了Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02Linux?shell命令行查詢文件中內(nèi)容常用的命令及其用法
在Linux中,查找文件內(nèi)容可以使用多種命令,如grep、find、ack和ripgrep,這些工具各有特點(diǎn),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09linux?shell中Grep命令查找多個字符串(grep同時(shí)匹配多個關(guān)鍵字或任意關(guān)鍵字)
grep是一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來,下面這篇文章主要給大家介紹了關(guān)于linux?shell中Grep命令查找多個字符串(grep同時(shí)匹配多個關(guān)鍵字或任意關(guān)鍵字)的相關(guān)資料,需要的朋友可以參考下2022-08-08Linux Shell循環(huán)中實(shí)現(xiàn)展示進(jìn)度百分比的實(shí)現(xiàn)方法
這篇文章主要介紹了Linux Shell循環(huán)中實(shí)現(xiàn)展示進(jìn)度百分比的實(shí)現(xiàn)方法的相關(guān)資料,這里提供實(shí)現(xiàn)方法及實(shí)例,需要的朋友可以參考下2017-08-08