某些情况下,自己或同事修改了某处系统设置,但由此所引发的问题可能一段时间以后才会暴露,由于记不清之前改过哪些文件、改了哪些内容,解决问题时可能走弯路。于是写了一个小脚本以特定频率来监控常见系统配置文件,如发生变化,则邮件通知管理员。
这里小发散一下,笔者习惯在内网单独弄一台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
<code>/var/spool/cron/root</code>
<code>/etc/fstab</code>
<code>/etc/sysconfig/network-scripts/ifcfg-em1</code>
<code>/etc/sysconfig/network-scripts/ifcfg-em2</code>
<code>/etc/sysconfig/network</code>
<code>/etc/hosts</code>
<code>/etc/resolv</code><code>.conf</code>
<code>/etc/sudoers</code>
<code>/etc/selinux/config</code>
<code>/etc/sysconfig/iptables</code>
<code>/etc/ssh/sshd_config</code>
<code>/root/</code><code>.</code><code>ssh</code><code>/authorized_keys</code>
下面看脚本内容
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
<code>#!/bin/sh</code>
<code>for</code> <code>ip_server </code><code>in</code> <code>$(</code><code>cat</code> <code>/shells/ips</code><code>.txt) </code><code>#记录局域网的所有主机ip和主机名</code>
<code> </code><code>do</code>
<code> </code><code>(</code>
<code> </code><code>ip=$(</code><code>echo</code> <code>$ip_server|</code><code>awk</code> <code>-F </code><code>'-'</code> <code>'{print $2}'</code><code>) </code><code>#获取各server IP</code>
<code> </code><code>#rsync -a -e /shells/server_conf.txt $ip:/shells/ ###初次执行以及被监控的文件列表有修改时才需同步</code>
<code> </code><code>ssh</code> <code>$ip '</code>
<code> </code><code>tmp_dir=</code><code>/var/log/check_conf</code><code>; </code><code>###创建用于存放‘上一次的’配置文件的目录</code>
<code> </code><code>if</code> <code>[ ! -d </code><code>"$tmp_dir"</code> <code>];</code>
<code> </code><code>then</code>
<code> </code><code>mkdir</code> <code>$tmp_dir;</code>
<code> </code><code>fi</code><code>;</code>
<code> </code><code>for</code> <code>conf_file </code><code>in</code> <code>$(</code><code>cat</code> <code>/shells/server_conf</code><code>.txt); </code><code>###获取各配置文件绝对路径</code>
<code> </code><code>do</code>
<code> </code><code>conf_name=</code><code>"${conf_file##*/}"</code> <code>###获取文件名,不含目录.这个写法不太常用,某些</code><code>awk</code><code>无法使用的情况可以用它</code>
<code> </code><code>###diff判断内容是否改变,并调整输出格式</code>
<code> </code><code>diff</code> <code>$conf_file $tmp_dir/$conf_name.last > </code><code>/dev/null</code><code>;</code>
<code> </code><code>if</code> <code>[ $? != 0 ];</code>
<code> </code><code>then</code>
<code> </code><code>echo</code> <code>-e </code><code>"diff $conf_file $conf_name.last\n-------------------------"</code><code>;</code>
<code> </code><code>diff</code> <code>$conf_file $tmp_dir/$conf_name.last;</code>
<code> </code><code>fi</code><code>;</code>
<code> </code><code>###将现在的配置文件同步到$tmp_dir以备下一次对比</code>
<code> </code><code>rsync</code> <code>-a $conf_file $tmp_dir/$conf_name.last > </code><code>/dev/null</code><code>;</code>
<code> </code><code>done</code><code>;' &> </code><code>/tmp/</code><code>$ip.tmp</code>
<code> </code><code>if</code> <code>[ $(</code><code>cat</code> <code>/tmp/</code><code>$ip.tmp|</code><code>wc</code> <code>-l) -gt 1 ];</code><code>then</code>
<code> </code><code>mailx -s </code><code>"$ip_server conf_file modified"</code> <code>[email protected] < </code><code>/tmp/</code><code>$ip.tmp</code>
<code> </code><code>fi</code>
<code> </code><code>)& </code><code>###以子shell形式达到for循环并行的效果</code>
<code>done</code>
<code>wait</code>
效果截图
<a href="http://s3.51cto.com/wyfs02/M00/74/97/wKiom1YiaRyAOxMSAACth92v3Vo838.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/74/97/wKiom1Yia6LQf8YfAACVk0G5C6o412.jpg" target="_blank"></a>
本文转自kai404 51CTO博客,原文链接:http://blog.51cto.com/kaifly/1703701,如需转载请自行联系原作者