这个bash脚本有多危险?

7

警告:危险的脚本。不要从命令行运行!

我在公司的一个笑话邮件中看到了这个。有人能解释一下为什么这个Bash脚本比普通的“rm -rf”命令更危险吗?

nohup cd /; rm -rf * > /dev/null 2>&1 &

特别是,为什么要使用nohup?最后的元素是什么? 警告:危险脚本。请勿从命令行运行!

1
这只是一个非常边缘的编程问题。 - DGM
1
--no-preserve-root(吹口哨) - Daniel Kamil Kozar
5个回答

6
你可以尝试一些比较“安全”的选择:
nohup cd /; find * >/dev/null 2>&1  &

我收到了这个消息:
nohup: ignoring input and appending output to `nohup.out'
nohup: cannot run command `cd': No such file or directory
[2] 16668

所以,nohup部分并不起作用,它只会触发一个错误。原始脚本的第二部分尝试删除当前目录中的所有内容,并且无法通过Ctrl-C停止,因为它在后台运行。所有输出都被重定向到虚空中,所以您看不到任何“访问被拒绝”的进度消息。

为什么这个被点赞了?nohup不会触发错误。它会从终端分离,这样你就可以关闭终端而进程仍然在运行。 - DGM
@DGM:你试过了吗?你用的是哪个版本的shell和nohup? - choroba
作为一名互联网服务提供商的系统管理员多年来,我经常使用nohup。它做了我说的事情。在Mac上使用bash运行此命令正是我所期望的——将find放到后台,并消除所有输出。可能是您使用的shell或操作系统导致它无法正常工作。无论如何,这是另一个网站的讨论话题。 - DGM
顺便提一下,如果有人运行此命令,它将会扫描每个文件直到磁盘崩溃。虽然不会造成破坏,但会使计算机变慢。使用“ps ax | grep find”查找进程的PID,然后使用“kill 12345”杀死它(当然要用正确的pid)。 - DGM
@DGM:find 被重定向和后台化的 & 静音。Nohup 不是一个 shell 内置命令,因此它不能接受内置命令作为参数。该脚本引自 http://www.theregister.co.uk/2006/02/24/bofh_2006_episode_8/。 - choroba
显示剩余2条评论

4

2>&1将stderr(文件句柄2)重定向到stdout(文件句柄1)。&单独将rm命令放入后台。nohup允许作业在启动它的人注销后继续运行。

换句话说,即使用户退出终端/ shell,该命令也会尽最大努力清除整个文件系统。


1
文件句柄,也称为文件描述符。 - Dennis Williamson
1
幸运的是,这个脚本的表现并不像它的作者想象中那么糟糕。他或她对自己的想法感到非常害怕,以至于没有进行测试 :-) - choroba

3
笑话有点儿蹩脚,很明显它没有经过测试,他的意思是:
 nohup sh -e "cd / ; rm -rf *" > /dev/null 2>&1 &

或者
 nohup rm -rf / > /dev/null 2>&1 &

否则,nohup cd /; 部分将被shell视为一个单独的行。第二行只是生成rm -rf *命令,该命令递归删除当前目录(不包括以.开头的文件)。

2

nohup [..] &让命令在用户退出后继续在后台运行(我想这样做是为了更难停止它)

2>&1将stderr重定向到stdout

> /dev/null丢弃从stdout输出的任何内容

该命令基本上似乎什么都不做,而您的文件系统在后台慢慢被破坏。


2

nohup的意思是它会忽略挂起信号,这意味着即使用户没有登录,它也会继续运行。

cd / 将用户移动到根目录

rm -rf * 递归地删除所有文件(遍历所有目录)并强制执行(不关心文件是否正在使用)

结尾的部分将所有输出重定向到无处。它应该基本上将您的驱动器格式化为无。


如果您更详细地阐述了重定向,您将获得最佳答案。此外,您没有提到末尾的后台运行符“&”。不过,回答不错。 - derek8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接