某些情况下,自己或同事修改了某处系统设置,但由此所引发的问题可能一段时间以后才会暴露,由于记不清之前改过哪些文件、改了哪些内容,解决问题时可能走弯路。于是写了一个小脚本以特定频率来监控常见系统配置文件,如发生变化,则邮件通知管理员。
这里小发散一下,笔者习惯在内网单独弄一台server,给予其免秘钥登录所有服务器额权限,以便批量管理server。并且统计好一个文本文件,以”web1-x.x.x.x“每行一条记录的形式将所有server主机名和IP信息搜集于此。以备各种批量任务脚本引用。
注:这台内网管理server权限巨大,所以即便在内网,其密码复杂度、防火墙等安全措施也不容忽视。
下面是我当前监控的配置文件,记录于server_conf.txt文件
1
2
3
4
5
6
7
8
9
10
11
12
|
/var/spool/cron/root /etc/fstab /etc/sysconfig/network-scripts/ifcfg-em1 /etc/sysconfig/network-scripts/ifcfg-em2 /etc/sysconfig/network /etc/hosts /etc/resolv .conf
/etc/sudoers /etc/selinux/config /etc/sysconfig/iptables /etc/ssh/sshd_config /root/ . ssh /authorized_keys
|
下面看脚本内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#!/bin/sh for ip_server in $( cat /shells/ips .txt) #记录局域网的所有主机ip和主机名
do
(
ip=$( echo $ip_server| awk -F '-' '{print $2}' ) #获取各server IP
#rsync -a -e /shells/server_conf.txt $ip:/shells/ ###初次执行以及被监控的文件列表有修改时才需同步
ssh $ip '
tmp_dir= /var/log/check_conf ; ###创建用于存放‘上一次的’配置文件的目录
if [ ! -d "$tmp_dir" ];
then
mkdir $tmp_dir;
fi ;
for conf_file in $( cat /shells/server_conf .txt); ###获取各配置文件绝对路径
do
conf_name= "${conf_file##*/}" ###获取文件名,不含目录.这个写法不太常用,某些 awk 无法使用的情况可以用它
###diff判断内容是否改变,并调整输出格式
diff $conf_file $tmp_dir/$conf_name.last > /dev/null ;
if [ $? != 0 ];
then
echo -e "diff $conf_file $conf_name.last\n-------------------------" ;
diff $conf_file $tmp_dir/$conf_name.last;
fi ;
###将现在的配置文件同步到$tmp_dir以备下一次对比
rsync -a $conf_file $tmp_dir/$conf_name.last > /dev/null ;
done ;' &> /tmp/ $ip.tmp
if [ $( cat /tmp/ $ip.tmp| wc -l) -gt 1 ]; then
mailx -s "$ip_server conf_file modified" monitor@xxxx.com < /tmp/ $ip.tmp
fi
)& ###以子shell形式达到for循环并行的效果
done wait |
效果截图
本文转自kai404 51CTO博客,原文链接:http://blog.51cto.com/kaifly/1703701,如需转载请自行联系原作者