在Linux中有些命令可能功能强大,方便快捷,但是这些命令在测试环境中可以使用,在生产环境上则要慎之又慎,还有些命令本身就是危险的,运行前一定要三思。
工作中输入命令
举一个开源社区非常有名的因为空格造成惨痛教训的案例,开源项目叫bumblebee,这个项目本来不出名,不过程序在其安装脚本install.sh里的一个bug让这个项目一下子成了全世界最瞩目的项目,这个bug的fix如下:
@@ -348,7 +348,7 @@ case "$DISTRO" in
- rm -rf /usr /lib/nvidia-current/xorg/xorg
+ rm -rf /usr/lib/nvidia-current/xorg/xorg
如果仔细看,就会发现差别就是一个空格,这会导致非常严重的影响,下面我们来看看这些危险的命令。
1.rm -rf
对于这个命令最好的挽救措施就是备份,可能在有些环境中这类命令都是禁用的,但是不管如何,注意备份。
rm -rf /
rm -rf *
2.rm .*
这个命令比较容易犯错误,因为大家比较容易忽视,简单举个例子。
列出当前目录下的文件,考虑删除。
[ora11g@rac1 test]$ ll
total 4
-rw-r--r-- 1 ora11g dba 0 Jun 19 08:20 a_1.dmp
-rw-r--r-- 1 ora11g dba 0 Jun 19 08:20 a_2.dmp
-rw-r--r-- 1 ora11g dba 0 Jun 19 08:20 a_3.dmp
...
-rw-r--r-- 1 ora11g dba 0 May 2 17:44 e.lst
-rw-r--r-- 1 ora11g dba 0 May 2 17:44 f.log
来比较通过11得到的文件个数。
[ora11g@rac1 test]$ ll *|wc -l
13
如果使用rm * 但是不小心多输入了一个点,来看看会删除多少文件,它会尝试删除用户目录下所有的文件。
[ora11g@rac1 test]$ ll .*|wc -l
63
其实通过上面的例子可以看出三个命令(ls –l *, ls -l .*, ls –l . *)的不同,rm只是触发的一种方式。
3.快捷命令“^”
首先来看这个命令的方便性。如果想查看文件名含有dmp的,然后又想查询文件名含有bak的。
[ora11g@rac1 test]$ ls -lrt *dmp
-rw-r--r-- 1 ora11g dba 0 Jun 19 08:20 a_5.dmp
-rw-r--r-- 1 ora11g dba 0 Jun 19 08:20 a_3.dmp
-rw-r--r-- 1 ora11g dba 0 Jun 19 08:20 a_2.dmp
-rw-r--r-- 1 ora11g dba 0 Jun 19 08:20 a_1.dmp
-rw-r--r-- 1 ora11g dba 0 Jun 19 08:20 a_4.dmp
-rw-r--r-- 1 ora11g dba 0 Jun 19 08:34 a_55.dmp
[ora11g@rac1 test]$ ^dmp^bak
ls -lrt *bak
-rw-r--r-- 1 ora11g dba 0 May 2 17:45 a.lst.bak
这样两面性就出来了,如果你执行的是一个rm之类的操作,你都不知道会有多大的危害。
对于细节尤其需要注意
4.find rm
大家经常结合多个命令来使用,但是有些命令结合容易出现问题。 如果想查找文件名还有.bak的文件,然后直接rm,可以参考如下的命令。
find / -type f -name "*.bak" |xargs rm -rf {}\
但是如果你没有指定搜索路径,结果不小心删除了很多不期望删除的文件,这种情况我们碰见过,代码都开发完了,结果为了删除一些临时文件,很多额外的文件都删除了。
5.ps kill
rm攻击力很强,kill也是,如果想删除Oracle的一些进程,可以考虑如下的方式。
[ora11g@rac1 test]$ ps -ef|grep ora_
ora11g 18111 1 0 18:56 ? 00:00:00 ora_w000_TEST01
ora11g 18555 18365 0 19:16 pts/0 00:00:00 grep ora_
ora11g 24706 1 0 Jul27 ? 00:00:14 ora_pmon_TEST01
ora11g 24709 1 0 Jul27 ? 00:00:02 ora_psp0_TEST01
ora11g 24714 1 0 Jul27 ? 00:00:44 ora_vktm_TEST01
ora11g 24721 1 0 Jul27 ? 00:00:00 ora_gen0_TEST01
ora11g 24739 1 0 Jul27 ? 00:00:00 ora_diag_TEST01
[ora11g@rac1 test]$
[ora11g@rac1 test]$ ps -ef|grep ora_|grep -v grep |cut -c 9-15
18111
24706
24709
24714
24721
24739
但是话说回来,你需要保证有些进程必须不含有ora_,如果清掉了,也是很严重的问题。
6.tr
这个命令一般视为sed的简化版,但是有些功能可能并不是你想要的。
比如创建一个文件,只有一行内容。
[ora11g@rac1 ~]$ cat a
this is a test for tr command, abc
然后我们想把abc替换为xyz
[ora11g@rac1 ~]$ cat a|tr "abc" "xyz"
this is x test for tr zommxnd, xyz
结果发生了不期望发生的结果。
7.cat
cat这个命令本身没有什么问题,如果想快速建立文件,使用如下的方式,可以直接使用重定向。
首先模拟问题,然后输出文件内容,有两行。
[ora11g@rac1 ~]$ cat a
this is a test for tr command, abc
this a a test
快速创建文件。
[ora11g@rac1 ~]$ cat > a
this is not a test
^C
[ora11g@rac1 ~]$ cat a
this is not a test
可以看到如果文件已经存在,会直接覆盖掉,这种类似的操作在写shell脚本时尤其要注意。
文件管理繁琐而复杂,尤其需要注意
8.ifconfig –a6和ifconfig –a 6
就因为一个空格就会造成网络地址瞬间修改,如果是RAC,节点瞬间就会倒下。
小技能补充:需要注意的是,对于不熟悉以及不确定的环境,黑屏时先敲一下空格键,敲了回车键很可能会有致命问题,这也是我们需要具备的一种专业态度。
领取专属 10元无门槛券
私享最新 技术干货