supervisión de puertos python3

Solía ​​usar shell combinado con nmap para la supervisión de puertos. Recientemente, tuve tiempo de reescribirlo con python.

Efecto de monitoreo:

image.png

La base de datos mysql se usa para leer la dirección IP, generar información detallada de IP, registrar el tiempo de falla y enviar para registrar si ha ocurrido una variable.

image.png

# - * - codificación: utf-8 - * - 
# @Time: 2020-4-10 22:13 
# @Author: yejunhai 
# @Site: 
# @File: port_monitor.py 
# @Software: PyCharm 


import pymysql 
import socket socket 
import sys 
tiempo de 
importación solicitudes de 
importación importar json 


def msg (texto): 
    #Enviar 
    a los 
    encabezados del robot WeChat empresarial = {'Content-Type': 'application / json; charset = utf-8'} api_url = "" # Este es el robot WeChat empresarial La dirección del webhook generado se puede modificar a la suya. 
    json_text = { 
        "msgtype": "text", 
        "text": { 
            "content": text 
        }, 
    } 
    request.post (api_url, json.dumps (json_text),

def port_check (ip, port): 
    # Verificar el 
    valor de retorno del socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 
    s.settimeout (2) 
    result = s.connect_ex ((ip, int (port))) 
    return result 

def out_log (texto): # Ejecutar para 
    escribir el registro. . . . . . . 
    Abrir con (F '{la sys.argv [0] .split () [0] "" registro.}.', 'A') como F: 
        Imprimir (texto, archivos = F) 


DEF down_time (IP): 
    cálculo # Tiempo de falla, mysql también se puede calcular, ¡no--! 
    cursor.execute (f "SELECT mzt.start_time, mzt.end_time FROM mzt WHERE mzt.ip = '{ip}'") 
    total_time = cursor.fetchone () 
    try: 
        start_time = total_time [0] 
        end_time = total_time [1] 
        duración = end_time-start_time
        return f "\ nTiempo de inicio de esta falla {hora_inicio} \ nTiempo de finalización de esta falla {hora_final} \ nTiempo de duración de esta falla {duración}" 
    excepto: 
        retorno "\ 
nLa hora de inicio de falla no se registra" #time 

format cur_time = time.strftime ("% Y-% m-% d% H:% M:% S", time.localtime ()) 

# Abra la conexión de la base de datos 
db = pymysql.connect ("127.0.0.1", user = "root ", passwd =" root ", db =" zwy ") 
# Use el método cursor () para crear un objeto cursor 
cursor cursor = db.cursor () 
# instrucción de consulta SQL 
sql =" SELECT mzt.ip, mzt.port1, mzt. port2, mzt.send, mzt.`Deploy Business` FROM mzt " 
# try: 

cursor.execute (sql) 
results = cursor.fetchall () # Obtenga la 
IP y el puerto y comience a hacer cosas 
para la fila en los resultados:
    ip = fila [0] 
    puerto1 = fila [1] 
    puerto2 = fila [2]  
    enviar = fila [3]
    descripción = fila [4] 
    # comprobar múltiples puertos
    para puerto en puerto1, puerto2: 
        si puerto! = '' y puerto! = Ninguno: 
            port_status = port_check (ip, port) 
            if port_status! = 0 y send == 0: 
                cursor.execute (f "UPDATE mzt SET send = ' 1 'WHERE mzt.ip =' {ip} '") #Actualizar después de que ocurra una alarma para evitar alarmas constantes 
                cursor.execute (f" UPDATE mzt SET start_time =' {cur_time} 'WHERE mzt.ip =' {ip} '") 
                #Registro de tiempo de falla db.commit () 
                msg (f "{cur_time} {descripción} {ip}: {puerto} ¡El puerto está cerrado, por favor verifique!") 
                # Enviar alarma out_log (f "{cur_time} {ip}: {puerto } verifique {port_status} enviar: {enviar} ") # escribir registro 
            #escribir elif port_status == 0 y enviar == 1:
                cursor.execute (f "UPDATE mzt SET send = '0' WHERE mzt.ip = '{ip}'")
                cursor.execute (f "UPDATE mzt SET end_time = '{cur_time}' WHERE mzt.ip = '{ip}'") 
                db.commit () 
                msg (f "{cur_time} {descripción} {ip}: {puerto}端口 恢复. {Down_time (ip)} ") 
                out_log (f" {cur_time} {ip}: {port} check {port_status} send: {send} ") 
            else: 
                out_log (f" {cur_time} {ip}: { puerto} verifique {port_status} enviar: {enviar} ") 
# excepto: 
# print (" Error: no se pueden recuperar los datos ") 
# 关闭 数据库
db.close ()

# El crontab tradicional antiguo se ejecuta regularmente

* / 1 * * * * / usr / bin / python3 /root/port_monitor.py

Supongo que te gusta

Origin blog.51cto.com/junhai/2487499
Recomendado
Clasificación