前言

最近客户要把所有安全厂商的系统日志统一收录监管,我们的系统日志存放在mysql中,所以得写个脚本取数据发送到他们的网络端口

代码实现

大体思路为取前五分钟的数据发送到第三方udp端口,每五分钟发送一次,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import pymysql,socket,time

# 建立数据库的连接信息
host = "10.7.2.20" # 数据库的ip地址
user = "root" # 数据库的账号
password = "123456" # 数据库的密码
port = 3306 # mysql数据库通用端口号
OUTPUTIP = "192.168.44.111" #目的ip
OUTPUTPORT = 6666 #目的端口

#创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

def main():

mysql = pymysql.connect(host=host, user=user, password=password, port=port)

#新建查询页面
cursor = mysql.cursor()

#sql
sql = 'select * from rs_datainsight.rs_admin_log where from_unixtime(createtime,\'%Y-%m-%d %H:%i:%s\') between date_format(date_add(now(), interval - 5 minute),\'%Y-%m-%d %H:%i:%s\') and date_format(now(),\'%Y-%m-%d %H:%i:%s\')'

#执行sql
cursor.execute(sql)

#返回结果
# result = cursor.fetchone() #返回单条数据
results = cursor.fetchall() #返回多条数据

for result in results:
#print(result)
#发送到第三方端口
s.sendto(str(result).encode("utf-8"),(OUTPUTIP,OUTPUTPORT))

#关闭查询
cursor.close()

#关闭数据库
mysql.close()

if __name__ == "__main__":
while True:
main()
time.sleep(300) #睡眠五分钟
s.close()

代码比较简单,就不多做叙述了,同时将脚本加入到任务执行计划里

1
*/5 * * * * /data/python3/bin/python3 /data/mysql2udp.py

每五分钟执行一次,保证脚本因为外界因素挂掉之后能够重启