2007-12-17
记一次root引起的血案
从开始用Linux的那天起,就始终被告知平时不要使用root帐户。但我一直认为,偶是程序员,又不是系统管理员,用root调试程序能方便很多,又何必给自己设这么多限制。
记得上次看到不要用root帐户的理由是:“直到你有一天无意间在根目录下rm -rf *,就会知道这么做的后果” 。当时就感觉这话言过其实了,那有人会那么呆啊。
再说我为人谨慎,一般也是不会误删什么的啦。
后来转用ubuntu,这系统做的更绝,直接把root给禁了。但这对于我也是徒劳,因为每次我装完系统,第一件事就是开启root用户。好在用debian用惯了,平时登陆xwindow不像redhat那样直接用root,但开命令行一般直接就是su -。
今天分到个写安装脚本的任务,用bash。
我也没学过bash编程,但想想也简单,就答应了。边学边写,临近晚饭,差不多快写完了。
就在这时,突然发现某个位置似乎对用户交互不合理,于是改之(事后证明是白改,根本不需要也不能这样)。
改完,测试,快到最后一步的时候报错:
rm : can not delete /dev/xxxx
正在纳闷,这是哪出的错。突然意识到大事不好,ctr+c打断执行,可是为时已晚,根目录下的大部分文件都被删掉了,包括/bin目录。
就这样,一百多G的电影、软件、音乐、还有很多代码,都没了。
写安装脚本的vi窗口还没关,能看到代码,仔细检查,发现问题出在了一个条件判断上
echo -n "请输入xxx安装路径[默认:/usr/local/MyPast] " read PROG_PATH if [ "PROG_PATH" = "" ] then PROG_PATH="/usr/local/MyPast" fi ... rm -rf $PROG_PATH/*
看出来了么?PROG_PATH前少了个”$”。
测试时选择了默认路径,也就是直接回车,read PROG_PATH后变量PROG_PATH的值为空。
而接下来if中的条件判断由于少了个$,导致比较结果为非真。PROG_PATH=”/usr/local/MyPast”没有执行。
到了下面, rm的参数$PROG_PATH/*被解释为/*
所以 rm -rf $PROG_PATH/*就变成了rm -rf /*
“直到你有一天无意间在根目录下rm -rf *,就会知道这么做的后果” 。
妈的,这回我懂了。
看来这两天真是脚本与维护不宜。前天搞坏了数据库里的数据,今天又干掉了一个系统,郁闷。