python 监控服务端口并发送钉钉和邮件v1.0

python 监控服务端口并发送钉钉和邮件v1.0

基本逻辑

  • 把ip+ports定义到json文件
  • 加载json文件
  • 循环json文件里面定义的多主机端口
  • 开启socket线程监测端口是否监听
  • 异常时直接通知钉钉同时把异常ip+port写入文件
  • 邮件附件发送异常文件

说明

本脚本只是能监测服务端口是否开启,无法监测服务是否健康。只能做个简单的监控。

文件目录介绍

目录/opt/tools/monitoring/
[root@localhost rc]# tree -L 1
.
├── crontab.sh #定时任务脚本
├── ip_port.json # 定义主机和端口(多台服务器)
├── jk002.py #python 脚本
└── temp  # 异常端口和ip写入temp目录下的文件,邮件附件发送

1 directory, 3 files
[root@localhost rc]# 

crontab.sh 源码

#!/bin/bash

cd  /opt/tools/monitoring/
python jk002.py

ip_ports.json 文件定义

{
    "rlszw_dev": {
        "10.21.22.102": {
            "ssh": 22,
            "mysql": 3306,
            "show": 8099,
            "appInterface": 8098,
            "mis": 8097,
            "ass": 8096,
            "share": 8095,
            "ddm": 8094,
            "dctrl": 8093,
            "cas_server": 8092,
            "integration": 8091,
            "lszw_nginx": 8180,
            "cas_nginx": 8181,
            "dcmqttd": 18700,
            "acadgrpc": 18600
        }
    }

jk002.py源码

# -*- coding:utf8 -*-


import socket
import time
import os
import thread
import json
import urllib2
import sys
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
reload(sys)
sys.setdefaultencoding('utf-8')
socket.setdefaulttimeout(1)

date = time.strftime("%Y%d%m%H%M")
file = './temp/'+date+'result.'+'txt'


def dingding(tokenid, subject, message):
    url = "https://oapi.dingtalk.com/robot/send?access_token=" + tokenid
    header = {
        "Content-Type": "application/json",
        "charset": "utf-8"
    }
    data = {
        "msgtype": "text",
        "text": {
            "content": subject + '\n' + message
        },
        "at": {
            "atMobiles": [
                "1518*****"
                # "1352*****"
                # "1519*****",
                # "1510*****",
                # "1833*****"
            ],
            "isAtAll": False
        }
    }
    sendData = json.dumps(data)
    request = urllib2.Request(url, data=sendData, headers=header)
    urlopen = urllib2.urlopen(request)
    return urlopen.read()


def socket_port(ip, port):
    """
    输入IP和端口号,扫描判断端口是否开放
    """

    try:

        if port >= 65535:
            print u'端口扫描结束'
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = s.connect_ex((ip, port))
        message = str(port)
        if result == 0:
            lock.acquire()
            print ip, u':', port, u'端口开放'
            # write_result(ip.encode("utf-8")+':'+message+'端口开放')
            lock.release()
        else:
            lock.acquire()
            print ip, u':', port, u'端口异常,开始发送钉钉通知'
            tokenid = "************" #钉钉机器人tokenid 
            subject = ip.encode('utf-8')+'主机'
            message = str(port).encode('utf-8')+'端口异常'
            dingding(tokenid, subject, message)
            write_result(ip.encode("utf-8")+':'+message+'端口异常')
            lock.release()

        s.close()
    except Exception, e:
        print str(e)


def ip_scan(ip, ports):
    """
    输入IP,扫描IP的0-65534端口情况
    """
    try:
        print u'开始扫描 %s' % ip
        start_time = time.time()
        for i in ports:
            # print i
            # print type(i)
            thread.start_new_thread(socket_port, (ip, i))
            time.sleep(2)
        print u'扫描端口完成,总共用时 :%.2f' % (time.time() - start_time)
        # raw_input("Press Enter to Exit")
    except Exception, e:
        print str(e)


def send_mail():
    # 第三方 SMTP 服务
    mail_host = "smtp.163.com"  # 设置服务器
    mail_user = "******@163.com"  # 用户名
    mail_pass = "**********"  # 口令

    sender = '*************@163.com'
    receivers = ['********@qq.com','*******@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
    message = MIMEMultipart()
    # message = MIMEText('我们的工作基本一致', 'plain', 'utf-8')
    message.attach(MIMEText('服务端口监控', 'plain', 'utf-8'))
    message['From'] = sender
    message['To'] = ','.join(receivers)
    subject = '服务端口监控'
    message['Subject'] = Header(subject, 'utf-8')
    # 附件
    # 构造附件1,传送当前目录下的 test.txt 文件
    att1 = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
    # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    att1["Content-Disposition"] = 'attachment; filename="result.txt"'
    message.attach(att1)

    # # 构造附件2,传送当前目录下的 runoob.txt 文件
    # att2 = MIMEText(open('runoob.txt', 'rb').read(), 'base64', 'utf-8')
    # att2["Content-Type"] = 'application/octet-stream'
    # att2["Content-Disposition"] = 'attachment; filename="runoob.txt"'
    # message.attach(att2)

    try:
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
        print "邮件发送成功"
    except Exception, e:
        print str(e)


def write_result(result):

    # print file
    with open(file, 'a') as f:
        f.write(result+'\n')


if __name__ == '__main__':
    # url = raw_input('Input the ip you want to scan:\n')
    lock = thread.allocate_lock()
    # port = [3389, 22, 43, 135, 137]
    # ip = "127.0.0.1"
    with open("./ip_port.json", 'r') as f:
        data = json.load(f)

    for env_key in data:
        for ip_key in data[env_key]:
            ip = ip_key
            ports = data[env_key][ip_key]
            key_list = list(ports.keys())
            val_list = list(ports.values())
            ip_scan(ip, val_list)
    if os.path.exists(file):
        send_mail()


#

维护定时任务

crontab -e
输入 0 */1 * * * sh /opt/monitoring/crontab.sh

阿里云ecs服务器需要修改mail发送端口为ssl类型

采用vpc网络时,默认防火墙禁止25端口通信

    try:
        # smtpObj = smtplib.SMTP()
        smtpObj=smtplib.SMTP_SSL(mail_host, 994)
        # smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
        print "邮件发送成功"
        smtpObj.quit()
    except Exception, e:
        print "邮件发送失败"
        print str(e)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 端口:0 服务:Reserved 说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,...
    萧玄辞阅读 1,115评论 0 2
  • 查看网络端口被占用情况 原文 使用命令Netstat –ano|findstr “<端口号>” 查看该PID对应的...
    冯瑞_FR阅读 1,290评论 0 0
  • 闭上眼睛 却看得更远 叠加至陌生的北极 所以 我深思 夜的黑淹不没心的敞亮 断水的刀 别抽得太急 合起眼睑 一切源...
    唐泉阅读 156评论 0 1
  • 1:简书ID:鸣鸣嘛嘛 2:申请1枚功勋章:7月打卡12天 3:打卡日期分别为:0703,0711,0722,07...
    鸣鸣嘛嘛依然阅读 219评论 0 0
  • 派派和小舟坐在双福麻辣烫店里靠窗的位置,这天小舟不上班,俩人把甜豆儿交给豆儿奶奶,非常惬意地来吃垃圾食品。 派派:...
    玉汝于成_e348阅读 448评论 0 1