更安全的rm命令,保护重要数据
更安全的rm命令,保护重要数据
网上流传的安全的rm,几乎都是提供一个rm的"垃圾"回收站,在服务器环境上来说,这实非良方。
我想,提供一个安全的rm去保护一些重要的文件或目录不被删除,避免出现重要数据误删的悲剧,或许才是更佳方案。
我写了一个脚本:https://github.com/malongshuai/rm_is_safe ,源码和用法本文后面已经提供了,不过各位愿意捧场的可以去github上点个star。

工作方式
rm_is_safe会创建一个名为/bin/rm的shell脚本,同时会备份原生的/bin/rm为/bin/rm.bak。所以,原来如何使用rm,现在也以一样的方式使用rm,没有任何区别。
为了区分原生rm和伪装后的安全的rm,下面将伪装的rm命令称为rm_is_safe。
rm_is_safe会自动检查rm被调用时传递的参数,如果参数中包含了重要文件,可能意味着这是一次危险的rm操作,rm_is_safe会直接忽略本次rm。至于哪些属于重要文件,由你自己来决定。
rm_is_safe对所有用户都有效,包括目前已存在的用户和未来新创建的用户。
哪些是重要文件?
根目录
/以及根目录下的子目录、子文件总是自动被保护的你可以在
/etc/security/rm_fileignore中定义你自己觉得重要的文件,每行定义一个被保护的文件路径。例如:/home/junmajinlong
/home/junmajinlong/apps
现在,该文件中定义的两个文件都被保护起来了,它们是安全的,不会被rm删除。
注意事项:
- 显然,被保护的目录是不会进行递归的,所以'/bin'是安全的,而'/bin/aaa'是不安全的,除非你将它加入/etc/security/rm_fileignore文件中
- 根目录
/以及根目录下的子目录是自动被保护的,不用手动将它们添加到/etc/security/rm_fileignore中 - /etc/security/rm_fileignore文件中定义的路径可以包含任意斜线,
rm_is_safe会自动处理。所以,'/home/junmajinlong'和'/home///junmajinlong/////'都是有效路径 - /etc/security/rm_fileignore中定义的路径中不要使用通配符,例如
/home/*是无效的
Usage
1.执行本文后面提供的Shell脚本:
$ sudo bash rm_is_safe.sh
执行完成后,你的rm命令就变成了安全的rm了。
2.如果确实想要删除被保护的文件,比如你明确知道/data是可以删除的,那么你可以使用原生的rm命令,即/bin/rm.bak来删除。
$ rm.bak /path/to/file
3.如果你想要卸载rm_is_safe,执行函数uninstall_rm_is_safe即可:
# 如果找不到该函数,则先exec bash,再执行即可
$ uninstall_rm_is_safe
卸载完成后,/bin/rm就变回原生的rm命令了。
脚本:rm_is_safe.sh
脚本如下,假设其文件名为rm_is_safe.sh:
#!/bin/bash
###############################
# Author: www.junmajinlong.com
###############################
# generate /bin/rm
# 1.create file: /etc/security/rm_fileignore
# 2.backup /bin/rm to /bin/rm.bak
function rm_is_safe(){
[ -f /etc/security/rm_fileignore ] || touch /etc/security/rm_fileignore
if [ ! -f /bin/rm.bak ];then
file /bin/rm | grep -q ELF && /bin/cp -f /bin/rm /bin/rm.bak
fi
cat >/bin/rm<<'eof'
#!/bin/bash
args=$(echo "$*" | tr -s '/' | tr -d "\042\047" )
safe_files=$(find / -maxdepth 1 | tr '\n' '|')$(cat /etc/security/rm_fileignore | tr '\n' '|')
echo "$args" | grep -qP "(?:${safe_files%|})(?:/?(?=\s|$))"
if [ $? -eq 0 ];then
echo -e "'\e[1;5;33mrm $args\e[0m' is not allowed,Exit..."
exit 1
fi
/bin/rm.bak "$@"
eof
chmod +x /bin/rm
}
# for uninstall rm_is_safe
# function `uninstall_rm_safe` used for uninstall
function un_rm(){
# make efforts for all user
if [ ! -f /etc/profile.d/rm_is_safe.sh ];then
shopt -s nullglob
for uh in /home/* /root /etc/skel;do
shopt -u nullglob
cat >>$uh/.bashrc<<'eof'
# for rm_is_safe:
[ -f /etc/profile.d/rm_is_safe.sh ] && source /etc/profile.d/rm_is_safe.sh
eof
done
fi
cat >/etc/profile.d/rm_is_safe.sh<<'eof'
function uninstall_rm_is_safe(){
unset uninstall_rm_is_safe
/bin/unlink /etc/security/rm_fileignore
/bin/cp -f /bin/rm.bak /bin/rm
/bin/unlink /etc/profile.d/rm_is_safe.sh
shopt -s nullglob
for uh in /home/* /root /etc/skel;do
shopt -u nullglob
sed -ri '\%# for rm_is_safe%,\%/etc/profile.d/rm_is_safe.sh%d' $uh/.bashrc
done
}
export -f uninstall_rm_is_safe
eof
}
rm_is_safe
un_rm
更安全的rm命令,保护重要数据的更多相关文章
- 下厨房6月26日数据丢失事故总结 MYSQL主分区被rm 命令误删除
下厨房6月26日数据丢失事故总结 MYSQL主分区被rm 命令误删除 http://tech.xiachufang.com/?p=18 在6月26日凌晨12点左右,我们在做线上数据库的备库时,误将线上 ...
- 每天一个Linux命令(5)rm命令
rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 注意:使用rm命令要格外小心.因为一旦 ...
- Linux命令学习总结:rm命令
命令简介: 该命令用来删除Linux系统中的文件或目录.通常情况下rm不会删除目录,你必须通过指定参数-r或-R来删除目录.另外rm通常可以将该文件或目录恢复(注意,rm删除文件其实只是将指向数据 ...
- linux命令(5):rm 命令
linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有 ...
- 每天一个 Linux 命令(5):rm 命令
昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所 ...
- 每天一个linux命令(5):rm 命令
昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所 ...
- rm 命令(转)
昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所 ...
- 转每天一个linux命令(5):rm 命令
昨天学习了创建文件和目录的命令mkdir ,今天学习一下linux中删除文件和目录的命令: rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所 ...
- rm 命令
rm 命令 rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 语法 rm (选项) (文 ...
随机推荐
- 2020-3-3 20175110王礼博 《网络对抗技术》Exp1 PC平台逆向破解
目录 1.实践目标与基础知识 2.直接修改程序机器指令,改变程序执行流程 3.通过构造输入参数,造成BOF攻击,改变程序执行流 4.注入Shellcode并执行 5.实验收获与感想 6.什么是漏洞?漏 ...
- Linux下删除大量文件效率对比
来自公众号:马哥Linux运维 今天我们来测试一下Linux下面删除大量文件的效率. 首先建立50万个文件 $ test for i in $(seq 1 500000);do echo text ...
- 使用spring连接mysql数据库出错
最近在学习spring框架,但是在学到JdbcTemplate时连接数据库一直报错,百度谷歌各种查找都能没有解决问题,简直要癫狂,报错信息如下: org.springframework.jdbc.Ca ...
- thinkphp5.0远程执行漏洞
0x01 漏洞简介 由于ThinkPHP5 框架控制器名 没有进行足够的安全监测,导致在没有开启强制路由的情况下,可以伪装特定的请求可以直接Getshell(可以控制服务器) 0x02 环境搭建 Ph ...
- 微信小程序与H5数据传递
这的场景是 小程序webview 加载 H5应用 需求点: 1. 小程序的登录code 需要与H5应用的sessionId建立绑定关系 2.H5内发起微信小程序支付,支付参数传递到小程序,支付结果传递 ...
- wireshark没有找到接口
今天安装wireshark,打开发现显示没有找到接口,网上搜索发现出现这种问题的都是win10,但是我的是win7 看了一下win10这种问题的原因是自带的winpcap不支持win10,应到http ...
- JAVA获取EXCEL列头
FileInputStream fileInputStream = new FileInputStream(rootPath + path + "/" + fileName); L ...
- Nikto使用方法
Introduction Nikto是一款开源的(GPL)网站服务器扫描器,使用Perl基于LibWhisker开发.它可以对网站服务器进行全面的多种扫描,包括6400多个潜在危险的文件/CGI,检查 ...
- Juli函数
- 你只要5行代码,拥有你的个性二维码,用Python生成动态二维码
如果想了解更多关于python的应用,可以私信我,或者点击下方链接自行获取,里面到资料都是免费的(http://t.cn/A6Zvjdun) 二维码满天飞,但是有没有想过Python也能制作出专属于自 ...