🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 服务器登录报警脚本的编写 >[success]要实现的功能,就是当有用户登录服务器时,会自动向指定邮箱发送信息 ### 服务器登录报警设置 ~~~ #================服务器登录报警脚本============ #!/bin/bash #登录报警 mkdir /root/tmp &>/dev/null echo "===================登录用户=======================">>/root/tmp/1.txt echo "$(whoami)">>/root/tmp/1.txt echo "===================当前在线用户===================">>/root/tmp/1.txt echo "$(who)">>/root/tmp/1.txt echo "===================登录时间=======================">>/root/tmp/1.txt echo "$(date)">>/root/tmp/1.txt echo "====================登录IP========================">>/root/tmp/1.txt echo $(w|sed -n '3p'|awk '{print$3}')>>/root/tmp/1.txt IP=$(ifconfig eth1 | grep "inet addr" | awk '{ print $2}' | awk -F: '{print $2}') mail -s "$(date)[IP:$IP]服务器登录报警"yfketang@163.com</root/tmp/1.txt rm -f /root/tmp/1.txt ~~~ 当用户登录时执行,需要把该脚本放入 /etc/bashrc中,这样当有用户登录服务器时,就会自动发送邮件 可以同时发送到139邮箱一份,因为139邮箱可以设置免费短信提醒功能。 >[danger]在这里要注意,登录报警脚本的位置,这个非常重要!这个脚本的位置一定不要放在/root目录下,否则的话非root用户登录时,就没有权限执行该脚本。最好把该本设置为755权限。 脚本写好后,加入定时任务,执行了,但是获取不到ip地址,ifconfig 和 iptables 没有正常执行:提示如下错误: ~~~ /var/www/data/autosendmail.sh: line 13: ifconfig: command not found /var/www/data/autosendmail.sh: line 14: iptables: command not found /var/www/data/autosendmail.sh: line 15: iptables: command not found ~~~ 因为没有使用绝对路径,改成/sbin/ifconfig后就好了。(但脚本的通用性就可能出现问题了 —_—! ) 应该是定时任务时没有环境变量所至。 ### 扩展内容 #### 磁盘监控报警脚本 >[success]定时判断磁盘可用空间大小,当它小于指定阀值时,向管理者邮箱发送报警邮件。 ### 本脚本的关健点 #### 1. 获取磁盘可以用空间大小 >[info]通过df -P命令,获取到磁盘情况,然后使用sed,awk,grep等取出所需要的数据。 执行df -P -h命令后,运行结果如下:要判读是根目录的可用空间的百分比,即红框内的值 ![](https://box.kancloud.cn/c3008da3adf60772dc0c75f6634d8c38_785x141.png) 取出48%的方式如下: ~~~ # 这样就可以获取到剩余空间的百分比,取值的方式,不至下面这一种方法 [root@localhost ~]# df -P -h |sed -n '/\/dev\/sda1/p'|awk '{print $5}'|awk -F "%" '{print $1}' ~~~ #### 2. 判断是否符合报警条件 在这里会用到if-then语句 命令格式: ~~~ if command then commands fi ~~~ >[danger]if-then语句是不能测试命令退出状态码之外条件的,所以linux中的if-then语句不能直接判断数值比较等。但是linux中提供了tset命令,可以使用它来测试不同条件的用途。 命令格式如下: ~~~ if test condition then commands fi ~~~ bash shell中还提供了另一种条件测试方法,无需在if-then语句中声明test命令。 ~~~ if [ condition ] # 中括号内,条件语句的两边要留一个空格 then commands fi ~~~ #### 脚本编写 >当根目录可用空间不足50%时,给出警告 ~~~ #! /bin/bash free=$(df -P -h |sed -n '/\/dev\/sda1/p'|awk '{print $5}'|awk -F "%" '{print $1}') if [ $free -lt 50 ] then echo "可用空间为:$free%"| mailx -s "磁盘已满" 576617109@qq.com >/dev/null fi ~~~