好久没灌水,来讲个故事

一、故事的源头:设备配置的备份

一个房子里面有N多设备,每个设备都有配置数据,要例行备份。

摘取了共同点,硬件设备基本上都支持tftp,那么就装了个简单的tftp服务器,在parrot里面是叫tftp-hpa的一个包,设置好目录权限和自动启动,然后像等外卖送饭一样坐等上传了。

└──╼ #cat /etc/default/tftpd-hpa 
# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/dir/of/tftp/upload"
TFTP_ADDRESS="0.0.0.0:69"
#TFTP_OPTIONS="--secure"
TFTP_OPTIONS="-l -c -s"
----------------------
──╼ #systemctl status tftpd-hpa.service 
● tftpd-hpa.service - LSB: HPA's tftp server
   Loaded: loaded (/etc/init.d/tftpd-hpa; generated)
   Active: active (running) 
......

下一步自然就是考虑如何喊各设备送饭了:

设备型号不一,有意思的是先拎出了个相比之下最高科技的几只,竟然带有自动任务功能,配置好它的时间点以及执行的tftp命令,饭能准时送到 :grin:
然而傻瓜一点的设备怎么办? 好吧,只有自己动手丰衣足食了,找上门去要饭。。。设备设置有SSH端口维护管理,自然想到了expect自动上去拎了。于是有了如下段:

└──╼ $cat tftpDev1.exp 
#!/usr/bin/expect
set timeout 10     
set Devipaddress [lindex $argv 0]
spawn bash -c "ssh -c aes128-cbc OMuser@$Dev1ipaddress "    
expect "assword:"
send "passwd.of.YYYYMM\r"
expect "exit."
send " \r"
send "tftp 192.ParrotsecOS.IP.ADDR put Food.cfg Food_$Devipaddress.cfg"
send " \r"
send "quit \r" 
expect eof

然后有多少家就排多少家的菜单列进来,都要完了之后还不忘记找另个地方再转存一份,简单粗爆顺序的堆出来下面这段,能用也能看日志,反正能跑并且没问题就好 :clown_face:

└──╼ $cat tarScript.sh 
date >> /dir/of/tftp/upload/bakscript.log
expect -f /dir/of/tftp/tftpDev1.exp Door1.DEV.IP.ADDR | tee -a  /dir/of/tftp/bakscript.log
expect -f /dir/of/tftp/tftpDevN.exp Door2.DEV.IP.ADDR | tee -a  /dir/of/tftp/bakscript.log
......
...... 多少设备要备份的都堆在这里吧。。。
......
tar -zcvf   /dir/of/tftp/upload_$(date +%Y%m%d-%H%M%S).tar.gz    /dir/of/tftp/upload  >>  /dir/of/tftp/bakscript.log
expect -f  /dir/of/tftp/scripts/scpexpect.exp  /dir/of/tftp/upload_$(date +%Y%m%d)*.tar.gz >>  /dir/of/tftp/scripts/bakscript.log
date >>  /dir/of/tftp/bakscript.log
echo -e " \n\n"

scp的expect略过,网上摘的那么几行,改了下自己用的ip什么的就ok。

最后就是定时一下,所有的时间点设置在相差不了几分钟的样子吧,直接用cron了。

┌─[root@parrot]─[/dir/of/tftp/]
└──╼ #crontab -l
######......
12 0 * * * /bin/su - user -c " sh /dir/of/tftp/scripts/tarScript.sh "

至此,故事的源头到这里就讲的差不多了,长时间下来收获颇丰。。。

└──╼ #ls
...
....
upload_20171106-002321.tar.gz  upload_20180807-001221.tar.gz
upload_20171107-002320.tar.gz  upload_20180808-001221.tar.gz
┌─[root@parrot]─[/dir/of/tftp/scripts]
└──╼ #ll | wc -l
561

现在回头查看它最早的一个备份包是17年2月份的,侧面反映了系统大概是这个时候安装的,放在旁边不起眼的一个HTPC, 配置D5xx的CPU、2G内存、8G磁盘,这样可怜的配置还又被我利用继续榨取剩余价值了,心好狠毒。。。

二、故事再继续:从源头里面找关注的内容

从备份的配置数据里面找关注的内容

没有配置备份的时候,就不是太关注配置里面有什么东东,有了配置备份,要从配置里面挑自己想要用的东西了,毕竟比爬进设备再去用命令查更快捷一点,就像是饭菜没送到的时候没想过里面更喜欢哪些肉丝鱼片一样,送到了不免要看看里面有啥喜欢吃和不喜欢吃的 :grin:

本地最基本的查看,(顺便说一句本机系统一样是parrot,否则不会来这灌水讲故事) 看看一盘菜的大概样子 :money_mouth_face:

└──╼ $cat getDev1.sh 
#!/bin/bash
ssh [email protected]  " cat /dir/of/tftp/scripts/upload/startup_Dev1.cfg  "
echo ""

常用的ssh连接都设置过Key,免密登陆还是比较方便的,长的帅不用饭卡凭借刷脸吃饭吧。像这样的getXXX.sh,改一改弄了一堆,用的时候敲get再tab键找吧,同一型号的可以共用一个的再通过参数传标识,也就是类似的Dev1换成了$1。

后来发现查看的关注点有些时候需要专注了,怎么办,再加过滤处理吧。。。 于是有了下面这个过滤设备内外网络端口对照配置的脚本。

└──╼ $cat getnatserver.sh 
#!/bin/bash
ssh [email protected]  " cat /dir/of/tftp/scripts/upload/ "| grep "nat server" | sed 's/^.* \([[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}.*\) inside.* \([[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}.*\)$/\1 ~~~ \2/g' | sed 's/www/80/g' | awk '{ if ($2=="~~~") { print "--- This is a unexcept line ---" ; }  else printf("%18s%8s%18s%8s\n",$1,$2,$4,$5); fi }' |sort -k4n,4 -k3,3

它的功能是把其中一个设备上所有的nat server protocol 。。。 1.2.3.4 80 inside 10.192.172.127 8080模式的配置内容抓出来再格式化一下。处理后的样子大概是这样的,也算是土豆花生虽然很土也是一目了然看出来了:

└──╼ $./getnatserver.sh 
   1.2.3.1  any      10.192.172.12   any
   1.2.3.2  any      10.192.172.13   any
   1.2.3.5    80      10.192.172.21     80
   1.2.3.6    80      10.192.172.26     80
......

三、故事再再继续:找到的东西再一次搭配起来利用

结果重新组装curl命令探测服务状态

从菜里面夹到要吃的东西,那就团一起往嘴里送吧 :grin: 我有点编不下去了 :rofl::rofl::rofl: 。。。
继续,列表出来了,那么就可以把它做为下一个使用的输入,这里是做简单的外网探测端口的服务状态了,老规矩,还简单的堆出个脚本然后塞进cron里面,能用并且不出错就OK了,这里的主机是放在家里的一个小树莓派3b,惯例还是parrot发布的pi版本在里面跑着 :grin:

└──╼ #cat gencurl.sh 
#!/bin/bash
echo mvOld
mv  /root/srvmonitor/rst.txt  /root/srvmonitor/rstold.txt

echo GetNatCurlsTxt
ssh EXT.IP.ADDR.MAP -p SSHPORT /root/scripts/getnatserver.sh | sed 's/any/80/g' | awk '{printf("http://%s:%s/\n", $1, $2) }' > /root/srvmonitor/curls.txt

sed -i '/443/ s/^http/https/g '  /root/srvmonitor/curls.txt
sed -i '/DEL.EXCEPT.IP.ADDR/ d '  /root/srvmonitor/curls.txt

echo genRst
for ie in `cat /root/srvmonitor/curls.txt` ; do curl -I --retry 2 -s -o /dev/null -m 15 -w %{http_code} $ie ; echo -e " $ie" ; done  > /root/srvmonitor/rst.txt

echo DiffRst
diff /root/srvmonitor/rst.txt  /root/srvmonitor/rstold.txt > /root/srvmonitor/diffsrv.txt
if [ $? -ne 0 ] ;
then
 echo "  scpSendMail"
 scp -PSSHPORT /root/srvmonitor/diffsrv.txt [email protected]:/root/
 ssh EXT.IP.ADDR.MAP -pSSHPORT 'cat /root/diffsrv.txt |  mailx -s "DiffServices-`date`"  [email protected] '
 echo "  sendDone "
fi 

echo GenDone

大概功能是cron里面每小时一次,每次生成个rst.txt,生成之前先把上一个小时的备份到rstold.txt里面;通过调用上一步的脚本再组装curl的http链接;curl命令的参数配置成了只返回状态码,2次重试以免结果不准;顺便做些剔除无用数据等处理;最后比较一下近两个小时的差异;如果有则传回来结果文件并远程调用它mail出来,远程已有mail配置就没再在pi上配置了,mail相关的配置可参考之前发过一个帖子。

如果一小时之前和现在的状态有了差异,收到MAIL内容也就是结果文件的样子,其中第一行是结果文件中有差异的行号,第二行<是最近的状态,第四行>是一小时前的状态,如果多块差异也类似:

121c121
< 200 http://1.2.3.5:80/
---
> 000 http://1.2.3.5:80/

题外:监控服务状态有很多开源软件可用,但我并没有选择使用,主要是因为设备配置的变化与监控配置同步的时候发现跟不上节奏,并且ZABBIX等各种监控软件让它在一个小pi上跑也有些舍不得,怕累到它 :joy: , 所以也就这样跑几个简单实用基本不用去维护的脚本,然后坐等MAIL吧。

四、先讲到这,如果后面还有故事,那么就待续。。。

2 个赞

服务器资源由ZeptoVM赞助

Partners Wiki Discord