shell脚本在日常运维中是必不可少会应用到,下面是自己亲身经历过的一件事。会了定期清除日志,编写了一个shell脚本,内容如下:

[root@centos- tmp]# more remote_log.sh
#!/bin/bash
#
#
PRO_LIST="/tomcat-6.0.53/logs"
#move file
for PRO_PATH in $PRO_LIST
do
if [ ! -d $PRO_PATH ];then
echo "-----$PRO_PATH path no exist-------"
break
else
find $BAK_PATH/* -type f -mtime +60 -exec rm -rf {} \;
fi
done

内容很简单,大家应该能发现问题,其中倒数第三行中$BAK_PATH 变更是不存在的。

以上脚本如果在服务器上运行的话就惨了。

下面是我在测试环境下做的实验,大家都不要测试了。其实是我在生产中遇到的,当时蒙了一瞬间,立刻按下了ctrl+c。但发现系统在次登录已经无法登录了,很多命令无法使用,还好当时有一个终端在连接着,查看了一下发现/bin目录下的文件被删除了一部分。后来我通过sftp命令从别的系统上下载了/bin目录下的文件。系统基本是恢复了。这次还好是幸运的。

[root@centos- tmp]# sh remote_log.sh
rm: cannot remove ‘/home/w_nfs/test’: Permission denied
rm: cannot remove ‘/media/CentOS_BuildTag’: Read-only file system
rm: cannot remove ‘/media/EFI/BOOT/BOOTIA32.EFI’: Read-only file system
rm: cannot remove ‘/media/EFI/BOOT/BOOTX64.EFI’: Read-only file system

执行上面的脚本后,会随机删除系统上的文件。

经过这次事故后,我深深的爱上了以下两行命令

    set -o nounset

在默认情况下,遇到不存在的变更,会忽略并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止脚本的执行。
      set -o errexit

在默认情况下,遇到执行出错,会跳过并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止脚本的执行。

增加会脚本如下

#!/bin/bash
#
set -o nounset
set -o errexit
PRO_LIST="/tomcat-6.0.53/logs"
#move file
for PRO_PATH in $PRO_LIST
do
if [ ! -d $PRO_PATH ];then
echo "-----$PRO_PATH path no exist-------"
break
else
find $BAK_PATH/* -type f -mtime +60 -exec rm -rf {} \;
fi
done

执行结果如下,这样做安全多了。ansible-playbook 就显得更友善一些。

[root@centos- tmp]# sh remote_log.sh
remote_log.sh: line : BAK_PATH: unbound variable

Linux shell 误操作的更多相关文章

  1. linux shell 字符串操作(长度,查找,替换)详解

    linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...

  2. linux 防止误操作 mysql 数据库技巧

    mysql 帮助说明 1[oldboy_c64 ~]# mysql --help|grep dummy 2 -U, --i-am-a-dummy Synonym for option --safe-u ...

  3. linux shell 字符串操作

    转:http://justcoding.iteye.com/blog/1963463 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作 ...

  4. linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...

  5. (正则表达式)linux shell 字符串操作(长度,查找,替换,匹配)详解

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...

  6. linux shell 字符串操作详解(获取长度、查找,替换)

    在做shell批处理程序时候,常常会涉及到字符串相关操作.有许多命令语句,如:awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号,能够达到相似效果,大家知道,使用内部操作符会省 ...

  7. linux shell 字符串操作(长度,查找,替换)

    感谢原创,文章很有帮助. 转自:http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 一.判断读取字符串值 表达式 含义 ${v ...

  8. Linux shell字符串操作

    #!/bin/bash #镜像名 image="asr-server" #镜像版本 ver="5.2.1" #容器名 dname="asr" ...

  9. Linux shell 时间操作(取昨天 前天)

    1. 取今天时间 $date -d "now" +%Y-%m-%d 2. 取昨天时间 $date -d "yesterday" +%Y-%m-%d $date  ...

随机推荐

  1. C++嵌入lua

    需要在C++程序里面嵌入lua 下面是代码,怕忘记,记录一下 #include <stdio.h> #include <stdlib.h> extern "C&quo ...

  2. ffmpeg摄像头推流

    ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v z ...

  3. MVC、MVP 和 MVVM

    MVC Model–View–Controller 模型:管理应用程序的数据.逻辑和规则 视图:展示数据(可以直接从模型中获取数据) 控制器:接收输入并将其转化成模型和视图的命令 MVP Model– ...

  4. python学习笔记:(四)tuple(元组)常用方法

    tuple(元组)的常用方法 1.del 删除元组 #del 删除元组 a=(1,2,3) del a print(a) 2.len() 计算元组中,值的个数 #len:计算元组元素的个数 a=(1, ...

  5. c++ 读取 utf-8 文件到 string

    #include <iostream> #include <assert.h> #include <fstream> #include <string> ...

  6. IntelliJ IDEA 2019.1.1 maven框架web.xml中web-app版本过低导致不能正常使用EL表达式的解决方案

     1.软件版本 IDEA版本:IntelliJ IDEA 2019.1.1 maven版本:apache-maven-3.6.1 Tomcat版本:tomcat-8.5 2.问题描述 IDEA使用如下 ...

  7. 【ABAP系列】SAP ABAP 控制ALV单元格编辑后获取新的数值

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 控制ALV单元 ...

  8. PHP 对Memcache的使用实例

    <?php //连接Memcache$mem = new Memcache;$mem->connect("localhost", 11211) or die (&quo ...

  9. 【Linux开发】Ubuntu下几个软件的配置记录backup

    调用ubuntu命令行的方法:ctrl+alt+t gcc -o test test.c 开发工具包括eclipse,Qt等全部放入了/opt/路径下,java开发环境放在了/usr/local/jd ...

  10. Sql注入校验

    /// <summary> /// Sql注入校验 /// </summary> /// <param name="listWord">字符&l ...