当前位置: 首页 > news >正文

linux bash shell之递归函数:fork炸弹

所谓fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,fork炸弹并不需要有特别的权限即可对系统造成破坏。fork炸弹实质是一个简单的递归程序。由于程序是递归的,如果没有任何限制,这会导致这个简单的程序迅速耗尽系统里面的所有资源。下面是Jaromil设计的最简单的fork炸弹:

:() { :|:& };:

或者是

.() { .|.& };.

这么一行只有13个字符的命令,在linux bash shell中居然能占用掉系统的所有资源,实属强大,第一次看这么一行代码时会有些不知所云吧,下面把它换成一行一行就不容易理解了:

:()
{
: | : &
}
;
:

第1行说明要定义一个函数,函数名为小数点,没有可选参数。

第2行表示函数体开始。

第3行是函数体,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行,这样就以2的幂方加速占用系统资源。

第4行表示函数体结束。

第5行并不会执行什么操作,在命令行中用来分隔两个命令用。从总体来看,它表明这段程序包含两个部分,首先定义了一个函数,然后调用这个函数。

第6行表示调用本函数。

冒号“:”其实是函数名,这个bash脚本就是在不断的执行该函数,然后不断fork出新的进程。在很多的shell脚本语言中,“.”和“:”都是作为内嵌命令,但是bash shell会优先执行脚本中的函数,故在bash会调用上面定义的函数,而不是内嵌命令。

默认情况下,bash处于非POSIX模式,此时对命令的解释顺序如下:

*关键字,例如if、for等。

*别名。别名不能与关键字相同,但是可以为关键字定义别名,例如end=fi。

*特殊内嵌命令,例如break、continue等。POSIX定义的特殊内嵌命令包括:.(小数点)、:(冒号)、break、continue、 eval、exec、exit、export、readonly、return、set、shift、times、trap和unset。 bash又增加了一个特殊的内嵌命令source。

*函数。如果处于非POSIX模式,bash会优先匹配函数,然后再匹配内嵌命令。

*非特殊内嵌命令,例如cd、test等。

*脚本和可执行程序。在PATH环境变量指定的目录中进行搜索,返回第一个匹配项。

由于默认情况下,bash处于非POSIX模式,因此fork炸弹中的小数点会优先当成一个函数进行匹配。(注:使用小数点代替其中的冒号,也能起到完全相同的效果。)

要使用POSIX模式来运行bash脚本,可以使用以下三种方法:

*使用–posix选项启动bash。

*在运行bash之后,执行set-oposix命令。

*使用/bin/sh。

那就这样了吗?我们就束手无策了吗?当然不是,我们可以使用ulimit命令来限制进行的limit数,如执行ulimit -u 128命令,那么就限制最大只能调用fork函数创建进程128个,调用该命令后可以使用ulimit -a命令查看限制情况,接下来执行上面的那条13字符的命令,会有这样的提示:bash:fork:Resourcetemporarilyunavailable

fork炸弹让我们了解到了递归函数的精简、强大,但着实也存在很大的应用漏洞,需要自己使用过程中注意细节。关于fork炸弹可以通过http://en.wikipedia.org/wiki/Fork_bomb了解。


http://www.mrgr.cn/news/9382.html

相关文章:

  • 第15届蓝桥杯青少组Scratch初级组省赛真题试卷
  • android gradle 配置国内gradle地址
  • 最小生成树 - Kruskal算法
  • Spring Boot与桥接模式:构建灵活的产品分类体系
  • 【区间dp】 P1775 石子合并(弱化版) 题解
  • WeKnow-RAG
  • 『功能项目』新输入系统【06】
  • linux文件——文件系统——学习硬件:磁盘
  • 搜维尔科技:Manus Prime 3 Mocap 数据手套VR手套动作捕捉手套
  • 河南萌新2024第二场
  • 【C/C++笔记】从一个文件中讲取未知数目的整数。对这些整数排序,然后把它们输出到标准输出设备。选用vector、deque 还是 list?
  • Ubuntu技巧-Ubuntu远程访问之电信公网IP
  • 【SQL基础】联表查询、UNION(组合查询)题目
  • 【HarmonyOS】鸿蒙应用蓝牙功能实现 (三)
  • 单HTML文件集成Vue2+axios的使用
  • Apache Doris 跨集群数据同步 CCR 全面介绍
  • TCP 粘包问题
  • Android笔试面试题AI答之Kotlin(17)
  • [C语言]-基础知识点梳理-编译、链接、预处理
  • vector容器---性能优化