删库也不必跑路

删库原因

对于一些重复性较高、过程较复杂的工作内容,常常采用执行脚本的方法来提高效率,减少错误发生率。通常都是在Linux虚拟机或Windows个人机上写好脚本并在虚拟机上进行测试,没问题后才会上传至服务器上执行。
至于删库的原因,有一下几种可能:

  1. 写好脚本未在虚拟机上测试,将问题脚本直接上传至服务器执行导致误删库
#!/bin/bash
...
dir=$(pwd)
new_dir=$($dir/new_dir)
rm -rf $new_dir/* &>> /dev/null
...

上面这个脚本是有问题的,$(命令)会被shell优先执行,其输出结果将传给主命令,再执行主命令。第四行小括号内根本就不是命令,会返回空值给new_dir变量,导致第五行调取变量为空(实际执行rm -rf /)。

  1. 在服务器上输入命令时手误导致误删库

在日常服务器维护过程中,对于单个临时文件的删除,是不会写脚本来执行的,常常通过执行rm -rf /directory/file_name命令来删除少量临时文件。此时就容易手滑在敲完rm -rf /后就碰到了enter键,导致误删库。

知识点

  1. cd命令查询目录下内容
    若系统内ls命令被误删除后,可使用“cd命令 + tab键”来查看目录下的文件内容,但此方法只能查看目录下的文件名,不能查看文件的权限等详细信息。
  2. perl命令为文件赋予权限
    使用perl -e “chmod 777, ‘绝对路径/目标文件名’”,可将文件权限修改为"1411"SBIT权限。此时文件就有了执行权限。
[root@loaclhost ~]# perl -e "chmod 777,  '绝对路径/目标文件名'"
[root@loaclhost ~]# ll  绝对路径/目标文件名
-r----x--t  1  root  root  0  6月 13 18:42  目标文件名

解决方法

当确实发生了误删库时。

  1. 立刻ctrl + c 停止正在执行的删库进程
    注意:此时千万不要重启服务器和断开ssh远程连接
    发现脚本执行不正常,需要马上果断地掐断它,以防止造成重要数据丢失;
    不要关机或重启或断开ssh远程连接,以防止数据丢失关机后无法重启和无法建立ssh远程连接。
  2. 将此事上报直接领导
  3. 检查ls,cd,yum,rpm,tar,chmod,wget,perl命令是否被删
    检查方法就是执行这些命令,看能否执行。
    • ls,cd命令:用于检查哪些文件被删除
    • yum,rpm命令:用于安装恢复所需命令(ls,cd,tar,chmod,wget等)
    • tar命令:用于解压恢复回来的压缩包
    • chmod命令:用于给恢复所需命令赋予执行权限
    • wget命令:用于从web服务器下载恢复所需命令
    • perl命令:用于chmod命令被删后使用wget命令将chmod命令下载回来后的权限赋予
  4. 恢复恢复所需命令
    • 方法1
      使用yum或rpm命令安装:若yum源配置文件被删除,而yum或rpm命令未被删,需要手写 yum配置文件,此时可从互联网上找一份模板,使用vi或vim编辑器创建yum源配置文件,然后使用yum或rpm命令安装。
    • 方法2
      使用 wget命令从一台web服务器上下载:先登陆另一台正常的web服务器,将/bin目录复制至web服务器的web目录,接着就可以通过wget进行下载了。下载的命令需要使用chmod或perl命令赋予执行权限。
    • 方法3
      使用rz命令将Windows系统上的备份命令上传至Linux系统:上传的命令需要使用chmod或perl命令赋予执行权限。
  5. 恢复Linux系统
    使用ls和cd命令查询被删除的文件,登陆另一台正常的web服务器,将所需恢复目录压缩打包并复制至web服务器的web目录,通过wget进行下载,使用tar命令将压缩包解压至指定目录即可。
  6. 用备份数据恢复服务器独有数据库
    服务器上除了Linux系统外,还有许多重要的数据是和web服务器不一致的,因此需要将其他重要数据进行恢复,此时只需将之前的备份资料拿来进行数据恢复即可。

预防误删库

删库的罪魁祸首就是"rm -rf /*",但我们在工作中又不可能不使用它,为保证服务器数据安全,防止服务器数据被误删除,需要将删库风险扼杀在摇篮中,尽可能地避免删库问题的出现。

  1. 方案一: 脚本中删除文件或目录前必须判断“ / ”前面是否为空
#!/bin/bash
dir=`pwd`
if [ ${dir} != "" ]
then
	rm -rf $dir/*
fi
#判断变量目录是否为非空时执行删除目录下的文件
  1. 方案二: shell脚本中提前指定set -u
    Linux在执行shell脚本时,如果遇到不存在的变量,bash会默认将其当成空值继续执行变量前的命令。
    Linux中有一个命令set -u ,其功能就是在当前环境下,如果调用的变量不存在时,系统会报错,并退出当前脚本。
#!/bin/bash
set -u
rm -rf $dir/*

当执行上述脚本时,会报如下错误:

[root@localhost ~]#./脚本名.sh
[root@localhost ~]#脚本名.sh: line 4: dir: 未绑定变量
#以上执行结果为在shell中执行的结果
[root@localhost ~]#./脚本名.sh
[root@localhost ~]#脚本名.sh: line 4: dir: unbound variable
#此结果为在本地执行的结果
  1. 方案三: safe-rm 替代 rm
    • 下载safe源码包:
      wget https://launchpad.net/safe-rm/trunk/0.12/+download/safe-rm-0.12.tar.gz
    • 解压safe-rm
      tar -zxf safe-rm-0.12.tar.gz
    • 复制safe-rm到/usr/local/bin目录下
      cp safe-rm-0.12/safe-rm /usr/local/bin/rm
    • 添加环境变量
      vim /etc/profile
      #在最后一行添加:PATH=/usr/local/bin:$PATH
      保存后加载使其生效:source /etc/profile
    • 配置路径黑名单
      vim /etc/safe-rm.conf
      #添加要删除的路径按行分隔
      /
      /*
      /xxx/xxx
  2. 方案四: 建立回收站机制
    Windows系统中,在删除小文件时,默认将其放入回收站,即使误删除重要资料,也可以在回收站内恢复。
    Linux系统中,为确保数据安全,也可以建立回收站机制。
  • 思路:rm -rf file_name时,并不是真正执行删除操作,而是将文件移入一个指定目录,可以设置定时清理回收站,或在回收站文件大小达到一定容量时清理回收站。
  • 用shell脚本来实现:
#!/bin/bash
set -u

if [ -d /home/.recycle ]
then
	echo >> /dev/null
else
	mkdir /home/.recycle
fi
exit 1
RECYCLE="/home/.recycle"
for i in $*
do
	TIME=$(date +%Y-%m_%d)
	filename=$(basename $i)
	mv $i ${RECYCLE}/${filename}.${TIME}
done
  • 修改配置文件~/.bashrc,用写的脚本remove.sh替代rm
[root@localhost ~]#vim ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias rm='~/remove.sh'
...
  • 设置定时任务,定期清理回收站
[root@localhost ~]#crontab -e
0	0	*	*	*	rm -rf /home/.recycle/*
#每天0点自动清空回收站(也可以写脚本执行回收站文件达到多大容量时自动清空)
  • 加载~/.bashrc文件
[root@local ~]#source ~/.bashrc[root@local ~]#. ~/.bashrc
  • 对~/remove.sh脚本文件设置文件系统 i 属性
[root@local ~]#chattr +i ~/remove.sh
#文件系统 i 属性,任何用户不能修改文件内容,不能删除文件,可以执行文件(前提是文件有执行权限)
  1. 方案五: 根目录挂载为只读==(网上看到的方案,服务器上不允许使用)==
    在/etc/fstab文件中,将根目录以只读方式挂载。
    此方案生效后将无法修改/etc/fstab文件,即此方案是不可逆的。根分区下的所有文件只能读取,无法在根分区下创建、修改、删除文件。若执行rm -rf /*,/dev/disk目录下的设备文件将被删除,/boot目录下的所有系统文件也会被删除,因此此方案禁止在服务器上使用
[root@localhost /]# vim /etc/fstab 
# /etc/fstab
# Created by anaconda on Mon Jun  8 23:36:39 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/sda3	/	xfs		remount,ro,notime	0	0
#此文件中只需将这行第四列修改为remount,ro,notime即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值