Solía usar shell combinado con nmap para la supervisión de puertos. Recientemente, tuve tiempo de reescribirlo con python.
Efecto de monitoreo:
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.
# - * - 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