专栏名称: 程序员的那些事
最有影响力的程序员自媒体,关注程序员相关话题:IT技术、IT职场、在线课程、学习资源等。
目录
相关文章推荐
程序员的那些事  ·  董事长刺死CTO(2):董事长早已写好复仇名 ... ·  昨天  
码农翻身  ·  干货!服务器运维极简指南 ·  昨天  
待字闺中  ·  给MCP祛魅 ·  4 天前  
OSC开源社区  ·  MCP这么火,来一波简单实操记录 ·  4 天前  
OSC开源社区  ·  梁文锋拒绝用DeepSeek赚快钱,腾讯、阿 ... ·  2 天前  
51好读  ›  专栏  ›  程序员的那些事

史上最邪恶的脚本!没有之一!

程序员的那些事  · 公众号  · 程序员  · 2017-05-31 22:06

正文

(点击 上方公众号 ,可快速关注)


作者:Linux中国/wxy

https://linux.cn/article-8544-1.html

如有好文章投稿,请点击 → 这里了解详情


微博上的朋友 @马甲与小号 告诉我发现了一个奇怪的东西,本着好奇心使人进步(害死猫?)的目的,我去观摩了一番,于是就有了今天这篇文章。


这是一个 bash shell 脚本,其中有若干可以整蛊(结仇)你的同事的小技巧——或者说恶作剧。看完之后,感觉不寒而栗,要是谁敢这样整我,我一定和他绝交!


警告,切勿在生产环境体验,一切后果自负!

警告,切勿在生产环境体验,一切后果自负!

警告,切勿在生产环境体验,一切后果自负!


这个世界怎么了?


这个脚本主要由一些别名、函数、环境变量定义组织而成,执行该脚本后,你的 shell 环境就变成了一个光怪陆离的世界。


好了,那么我们来看看都发生了什么。


注:本脚本适用于 bash 环境,其它 shell 环境有些不支持。


可怕的默认编辑器


当系统调用默认编辑器来编辑比如 crontab 时,biu 的一下,文件没了!


export EDITOR=/bin/rm;


这是将 EDITOR 环境变量定义为 rm,而它原本应该是 vi、emacs 或 nano 的,体会一下,是不是很酸爽?


学习课堂:

EDITOR 环境变量用于定于系统的默认编辑器,在一些系统内置功能里面,比如编辑 crontab 时,会根据该变量调用默认编辑器。


猥琐的制表符(tab)


当你想用制表符来个自动补全时,你会它非但不干,而且还删除了一个字母,不信邪的你使劲多砸了几个制表符,这下好了,更多的字符被删除了。


tset -Qe $'\t';


原来是将制表符定义为退格键了。


学习课堂:

tset 用于设置终端特征;-e 参数设置擦除字符,缺省为退格字符;-Q 表示不显示设置信息(静默)。


莫名退出


有时候,执行一个命令就会莫名其妙地退出 shell,只不过是命令有个非 0 的返回状态嘛,为什么会这样?


((RANDOM % 10)) || set -o errexit;


学习课堂:

set -o errexit 等价于 set -e,表示有任何错误(命令的返回状态非 0 )时即退出。


啥都看(cat)不了


当我想看(cat)一下文件时,它居然就当没听见,到底文件里面有啥啊?


alias cat=true;


原来是把 cat 定义成 true 命令的别名了, true 命令啥都不干,不管你给它什么参数和什么输入,它只是静静地返回一个 0 的状态码。


学习课堂

true 命令和 false 命令常用于 shell 脚本中。


到底是按什么排列的啊?


好吧,我想看看目录里面有啥文件,于是我输入了 ls,咦?这是什么顺序?我再次输入一遍,怎么回事,列出的文件和目录又是一种顺序,难道它的输出看心情吗?


function ls { command ls -$(opts="frStu"; echo ${opts:$((RANDOM % ${#opts})):1}) "$@"; }


原来它用一个函数重新定义了 ls,所以,真是看心情,你永远不知道它会以什么顺序返回结果。


学习课堂:

ls 的 f 选项表示不排序输出(即只按照磁盘存储顺序输出);r 表示反向排序;S 表示按文件大小排序;t 表示按修改时间排序;u 表示按最后访问时间排序。


再也不要试着进入目录了


当我想进入目录看看时,惊奇的是居然没进去,难道没有自动补全我就输入错了?用前面那个奇奇怪怪的 ls 再次看看时,令人惊恐的是,那个目录!它没有了!!!不信邪的我又重复了这个过程,然后,我就一个子目录也没有了!


alias cd='rm -rfv';


这该死的,连输入 cd 这么无害的命令都这么可怕!


学习课堂:

rm 命令的 -r 表示可删除(非空)目录;-f 表示不需要确认删除;-v 表示删除后显示被删除的文件/目录名称——这里是用来嘲讽我删除了某个目录的吗?


还敢用 sudo 权限吗?


我很遵守安全守则,从来不用 root 直接登录,凡是管理任务,都用 sudo 来执行。


然而,现在无论我用 sudo 执行什么命令,都会马上关机,并将我输入的命令广而告之!这是我被系统讨厌了么?


alias sudo='sudo shutdown -P now';


学习课堂:


shutdown 命令用来关闭系统,-P 参数表示连同电源一起关闭; now 表示马上关机。这之后的参数(在此例中,是原本希望 sudo 执行的命令)会作为关闭前的通知信息,广播给系统上所有在线的用户。


我原本想静静,结果世界都静了


杂乱的屏幕输出让你厌憎,所以,一个 clear 命令就可以静静了——等等,为什么我的终端崩溃了?然后系统也死机了。


alias clear=':(){ :|:& };:';


这是将 clear 命令别名为一个 fork 炸弹了,据说这个是最精简、最难懂的 fork 炸弹了。至于炸弹的效果,嗯,世界都安静了


学习课堂:

Fork 炸弹带来的后果就是耗尽服务器资源,使服务器不能正常的对外提供服务,也就是常说的 DoS(Denial of Service)。


今夕是何年?


这光怪陆离的世界啊,让我疑似梦中,那么,现在是什么时候?当然,我肯定不会去翻日历的,输入 date 命令才是我们命令行极客该做的事情。看着返回的日期,我不禁怀疑我的记忆,难道我穿越了么?


alias date='date -d "now + $RANDOM days"';


学习课堂:


date 命令可以显示相对偏移的日期,上述命令中 $RANDOM 的结果是一个随机的整数,也就是说这里的 date 命令会返回若干天之后的日期。


如果你有一个鬼马的 CD 驱动器


现在 CD 驱动器用的不多了,但是很多机器上还残留着这个“咖啡杯托”,如果你有幸还有这个东西的话,或许今天它就被鬼怪附体了,一会弹出,一会又收回去,有时候你按下弹出键却毫无反应——当你真的将咖啡杯放上面时,小心,你的咖啡杯会掉下来!


将 CD 盘托当成咖啡杯托是一个笑话,据说某人曾经给电脑厂家打电话:

“您好,我想说你们的机器上的咖啡杯托以前挺好用的,可是现在它不动了。”

“‘咖啡杯托’?那是什么?”

“就是那个一按按钮就会弹出的托盘啊,放咖啡杯正好,还有合适的凹槽,设计的不错!以前都好好的,现在它不会弹出了。”







请到「今天看啥」查看全文