检测80端口
一、前言主要以Python和Shell方式在Centos7.9操作系统上编写脚本。脚本大概思路是通过netstat、grep、wc判断80端口的行数,行数为0
一、前言
主要以Python和Shell方式在Centos7.9操作系统上编写脚本。脚本大概思路是通过netstat、grep、wc判断80端口的行数,行数为0则启动httpd服务。
二、脚本思路
- 使用
netstat -lntp
监听所有端口 - 使用
grep ':80'
只筛选出80端口 - 使用
wc -l
统计出包含80端口的行数 - 判断包含80端口的行数是否为0,如果是0,则由163邮箱发送告警消息到qq邮箱
三、环境模拟
3.1 准备工作
1.关闭防火墙
(1)临时关闭防火墙
$ systemctl stop firewalld
(2)永久关闭防火墙
$ systemctl disable firewalld
2.关闭selinux
(1)临时关闭selinux
$ setenforce 0
(2)永久关闭selinux
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3.安装netstat
$ yum install net-tools
3.2 模拟环境搭建
1.安装 Apache
$ yum install httpd -y
2.关闭Apache
$ systemctl stop httpd
四、脚本编写
4.1 Shell脚本
1.编写python脚本
$ vim 6-mail.py nimport smtplibnfrom email.mime.text import MIMETextnnsender = "123456789@163.com"npassword = "AAAAAAAAAAAAA"nreceiver = "123456789@qq.com"nnmessage = MIMEText("告警信息:80端口未开启,已自动开启80端口")nmessage["Subject"] = "告警信息"nmessage["From"] = sendernmessage["To"] = receivernnsmtp_server = smtplib.SMTP("smtp.163.com", 25)nsmtp_server.login(sender, password)nsmtp_server.sendmail(sender, receiver, message.as_string())nsmtp_server.quit()
上面代码详细分析:
(1)导入库
import smtplibnfrom email.mime.text import MIMEText
- smtplib 库:提供了基本的 SMTP 功能
- email 库:提供了复杂的邮件内容构造功能
(2)定义了三个变量:sender、password 和 receiver。分别存储了发件人的邮件地址、密码以及收件人的邮件地址。
sender = "123456789@163.com"npassword = "AAAAAAAAAAAA"nreceiver = "123456789@qq.com"
注意这里的password不是邮箱登录密码。而是授权码!
(3)利用 MIMEText 库构造了邮件的内容
message = MIMEText("告警信息:80端口未开启,已自动开启80端口")nmessage["Subject"] = "告警信息"nmessage["From"] = sendernmessage["To"] = receiver
MIMEText
("告警信息:系统出现故障,请立即处理")` 构造了一个文本邮件message["Subject"] = "告警信息"
设置了邮件的主题message["From"] = sender
设置了发件人的邮件地址,这里指163邮箱message["To"] = receiver
设置了收件人的邮件地址,这里指qq邮箱
(4)登录执行发邮件并退出163邮箱
smtp_server = smtplib.SMTP("smtp.163.com", 25)nsmtp_server.login(sender, password)nsmtp_server.sendmail(sender, receiver, message.as_string())nsmtp_server.quit()
2.编写shell脚本
$vim 6.sh n#!/bin/bashnwhile :ndon num=`netstat -lntp | grep ':80' | wc -l`n if [ $num -eq 0 ]n thenn systemctl start httpdn python3.8 6-mail.pyn fin sleep 30ndone
上面netstat参数说明如下:
- -l:仅列出在监听的服务状态
- -n:直接使用IP地址,不通过域名服务器
- -t:显示TCP传输协议的连线状况
- -p:显示正在使用Socket的程序识别码和程序名称
上面wc参数说明如下:
- -l:统计行数
上面代码详细分析:
(1)创建了一个无限循环。:
是一个 shell 内置命令,不执行任何操作,因此循环将始终为真。
while :
(2)使用 netstat
命令显示网络连接及其状态,使用 grep
过滤输出以显示包含 :80
的行。最后,使用 wc -l
计算过滤行的数量。结果存储在 num
变量中。
don num=`netstat -lntp | grep ':80' | wc -l`
(3)检查 num
变量的值是否等于 0。如果值为 0,则表示端口 80 上没有运行服务。
if [ $num -eq 0 ]
(4)前面的条件为真,这一行使用 systemctl
命令启动 Apache Web 服务器。并运行一个 Python 脚本(6-mail.py
),该脚本可能用于发送电子邮件通知。
systemctl start httpdn python3.8 6-mail.py
(5)fi
关闭 if 语句,sleep 30
命令在重新启动循环之前暂停脚本 30 秒。
fin sleep 30ndone
3.执行shell脚本
$ bash 6.sh
4.登录qq邮箱,查看告警信息邮件,这里我就不截图了。