01 前言
上周刚经历了一个“删库跑路”的惨重事件,不知哪位无邪的童鞋把Confluence 的数据存储目录 /var 清空了,结果群众的怒火燃烧上了天空
这次结合自己的一些思考来记录一些有关脚本安全的点
02 案例分析
先来看一个简单的案例
在用户主目录下创建safe目录及相关文件用于测试演示
图1 示例图1mkdir safe && cd safe && touch {12..15}.sql && ls
假如写一段脚本删除safe目录下所有文件:
图2 示例图2这段是不是看起来没有问题,但如果由于有些大心脏的同学粗心,写成下面这样
图3 变量引用错误 图4 变量没有声明最终,脚本都变成了rm -rf * ,可怕至极
其实在shell脚本当中,为了防止这种现象,我们可以借助set 命令来实现相关控制
03 set 命令
关于set 命令有较多参数,这里介绍最常用的几个
-e : 遇到未正确执行的命令立刻退出
-u : 遇到未定义的变量,报错(但是不会退出)
-x : 相当于bash -x ,用于调试命令
-f : 取消通配符
我们以刚才图4那段有问题的脚本说事
为保证不错删东西 ,我们加一个set -u 选项 ,判断变量是否存在
图5 示例图3vim del.sh
我们执行一下,看看效果
图6:示例图4看,报错啦,dir这个变量没有声明,ls 查看一下文件,发现都还存在
set -e 与set -u 通常搭配在一起使用
一个是遇到错误退出,一个是发现空变量报错
这两个搭配在一起放在脚本里可以防止一些变量为空导致文件全被清空的问题
拓展一下:
如果只想应用在脚本的某一段中,那么
开始段落前加set -e 表示范围开始
结束段落后加 set +e 表示范围结束
set -x 与set + x同理。
04 总结
1、删文件其实不用rm -rf ,不是受迫性需要,不要使用rm -rf
2、修改、删除系统文件或其他重要的东西,先备份一份
3、非特殊需要,不建议在root下操作,普通用户即可
4、脚本加上set -e 与set -u保证安全
网友评论