Linux下巧用chattr、watch命令的实例
一、起因
前些日子,张戈在日志备份服务器加入了日志压缩的计划任务(详见服务器日志备份超节省空间的思路),结果发现监控总是发来 tar 的报警,提示存在 tar 进程。仔细检查 history 后发现是公司总部那边做的监控:
每 20 分钟执行一个监控脚本,然后删除。
分析下这样做的好处:①、不留痕迹;②、把 history 塞满,让其他操作无迹可寻(感觉有点蛋疼)。
二、擒获
每次执行后立马删除了,得想个办法把这脚本“擒获”!
于是我写了一个简单的脚本 catch.sh:
#!/bin/bash
test -f /tmp/hdd.sh && echo Catch it! && exit
test -f /home/suxirong/hdd.sh && cp /home/suxirong/hdd.sh /tmp
ps:如果发现 hdd.sh 就把它复制一份到 tmp 目录,如果 tmp 目录发现存在 hdd.sh 则打印 Catch it,结束脚本。
然后使用 watch 来执行它:
watch -n 0.1 /tmp/catch.sh
ps:每隔 0.1 秒执行上面的脚本,应该可以在删除之前获取脚本。
等了一段时间,看了下终端:
还真抓住了!
编辑 hdd.sh,发现了 tar 进程监控语句:
...略...
######################Mysql-TAR-Mon###################
for a in tar zip;do
common=`ps -ef|egrep -v "grep|start"|grep -w "$a"`
if [ -n "$common" ];then
echo -e "%%%%tTARt$ATIMEt$LanIpt$atAlarm"
fi
done
...略...
三、计策
一抓到“真凶”了,但是又不能处以“死刑”,因为还有“利用价值”,所以这是一个很棘手的事。
思考了下,有 2 种方案:
①、实时监控 hdd.sh 文件的出现,一出现就立即用 sed 干掉 tar 进程监控那一段代码;
②、固定 hdd.sh,让其无法删除和替换,然后删除 tar 监控代码;
进一步思考发现,方案①不可行,先不说这实时监控会占资源,就是如何在执行之前把内容给修改了,都是一个头疼的问题,毕竟 shell 都是写入内存再执行代码的。等你删除 tar 监控代码了,对执行也没任何影响。
于是准备实施方案②。
四、实施
1、修改 hdd.sh,屏蔽 tar 报警消息:
...略...
######################Mysql-TAR-Mon###################
for a in tar zip;do
common=`ps -ef|egrep -v "grep|start"|grep -w "$a"`
if [ -n "$common" ];then
#echo -e "%%%%tTARt$ATIMEt$LanIpt$atAlarm" 屏蔽此代码
fi
done
...略...
2、锁定 hdd.sh,让监控端无法替换或删除
①、如何让 suxirong 家目录下面的 hdd.sh 文件,无法修改和替换,首先想到的就是去掉所有权及写入权限:
chown root:root /home/suxirong/hdd.sh
chmod -w /home/suxirong/hdd.sh
结果,切换到 suxirong 账号,居然还是可以删除或替换。。。
②、突然想起 Linux 还有一个-i 的文件属性可以锁定文件不被修改,于是执行如下语句:
#还原初始属性
chown suxirong:users /home/suxirong/hdd.sh
chmod +w /home/suxirong/hdd.sh
#锁定文件
chattr +i /home/suxirong/hdd.sh
用 suxirong 账号试下效果:
所有者是 suxirong,也有可写权限,可就是无法修改,有种偷笑的赶脚:
suxirong@linux-mfb5:~> ll | grep hdd.sh
-rwxr-xr-x 1 suxirong users 4927 Jul 23 14:40 hdd.sh
suxirong@linux-mfb5:~>
suxirong@linux-mfb5:~>
suxirong@linux-mfb5:~> mv hdd.sh hdd
mv: cannot move `hdd.sh' to `hdd': Operation not permitted
好了,目的达到,现在就算是 root 都无法修改了!具体效果只要等明天日志压缩计划任务运行的时候就知道了。
五、写在最后
其实,chattr 和 lsattr 在张戈博客早期文章:Linux 基础知识之文件隐藏属性 一文中就已经提到过。这次主要分享一下我在工作中正好用到 chattr 的实例,另外就是利用 watch 命令持续间隔执行某脚本的方法,特殊场景使用会有奇效,完毕!
- rpc框架之 avro 学习 2 - 高效的序列化
- rpc框架之HA/负载均衡构架设计
- 使用Docker-Docker for Web Developers(2)
- 打造高效前端工作环境-tmuxinator
- 在Linux Mint上安装node.js和npm
- JS魔法堂:再识Number type
- (cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")
- (cljs/run-at (->JSVM :browser) "语言基础")
- 微博爬虫
- 电话域名受欢迎,微语言融资3000万
- 前端魔法堂——异常不仅仅是try/catch
- (cljs/run-at (JSVM. :all) "一起实现柯里化")
- (cljs/run-at (JSVM. :browser) "简单类型可不简单啊~")
- 前端魔法堂:解秘FOUC
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法