shell腳本批量監控Linux server配置文件的更改

某些情況下,自己或同事修改了某處系統設置,但由此所引發的問題可能一段時間以後纔會暴露,由於記不清之前改過哪些文件、改了哪些內容,解決問題時可能走彎路。於是寫了一個小腳本以特定頻率來監控常見系統配置文件,如發生變化,則郵件通知管理員。

這裏小發散一下,筆者習慣在內網單獨弄一臺server,給予其免祕鑰登錄所有服務器額權限,以便批量管理server。並且統計好一個文本文件,以”web1-x.x.x.x“每行一條記錄的形式將所有server主機名和IP信息蒐集於此。以備各種批量任務腳本引用。

注:這臺內網管理server權限巨大,所以即便在內網,其密碼複雜度、防火牆等安全措施也不容忽視。

下面是我當前監控的配置文件,記錄於server_conf.txt文件

/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

下面看腳本內容

#!/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" [email protected] < /tmp/$ip.tmp
  fi
  )&    ###以子shell形式達到for循環並行的效果
done
wait

效果截圖
image
image

發佈了50 篇原創文章 · 獲贊 33 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章