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

2024-08-26 05:52

本文主要是介绍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了解。

这篇关于linux bash shell之递归函数:fork炸弹的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107728

相关文章

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro