别以为我是在开玩笑。有些Linux命令轻则造成数据丢失,重则导致系统瘫痪。你看这位同学漫不经心,以root身份敲入了rm -rf /,强制删除 / 目录下的所有文件,这代价可是很惨痛的(相当于系统自杀)。
还有一个很好玩的例子,我用旺旺聊天的形式给你讲述:
小雪2012-08-25 15:28:10: 在你Linux系统上输入这串东西:(){ :|:& };
灰猫2012-08-25 15:28:34: 长得这么怪?
小雪2012-08-25 15:28:41: 试试看看是什么结果。谢了。
灰猫2012-08-25 15:28:44: 不好了。终端一直出现下面的提示:
-bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable -bash: fork: retry: Resource temporarily unavailable
很惨啊。
小雪2012-08-25 15:29:02: 哈哈,真的很惨。
灰猫2012-08-25 15:29:21: Ctrl+C都是不管用的。
小雪2012-08-25 15:29:21: 即便退出这个终端也是没有用的。
灰猫2012-08-25 15:29:31: 最后全都是这个。
-bash: pipe error: Cannot allocate memory -bash: pipe error: Cannot allocate memory
root用户搞不定,因为killall的速度受到了影响,只能重启机器了。
小雪2012-08-25 15:30:15:这就是著名fork炸弹。看来危害不小。
灰猫2012-08-25 15:30:34:别幸灾乐祸了。能告诉我什么原理吗?
小雪2012-08-25 15:31:43: 把:(){ :|:& };写成下面格式你就看懂了
:() { :|:& };
灰猫2012-08-25 15:32:13: 明白了。“:”函数里面定义操作是后台执行“:”函数重定向到“:”函数,“:”函数的递归调用。
小雪2012-08-25 15:32:15: 是滴。系统执行海量的进程直到死亡。
灰猫2012-08-25 15:32:43: 这样的代码不好分析,主要是因为不清楚“:”是可以做为函数名的。
小雪2012-08-25 15:33:12: Quite right。另外为了防止这个问题的出现,要限制赋予root权限的用户数量以及单用户的进程数。
灰猫2012-08-25 15:34:12: 哈哈。是的,拥有root权限的用户操作不慎很容易给系统造成破坏。
故事还没有结束。如何限制用户的进程数呢?我们可以在/etc/security/limits.conf文件末尾加入一行:
* hard nproc 200
限制用户的进程数为200,但root用户不会受这个限制。
这个命令行还涉及shell脚本编程,我们将在后面的章节来学习。