利用Python自动扫描代码关键字并预警的实战方案
本文介绍如何使用Python结合GitPython库自动扫描代码仓库中的敏感关键字,并通过邮件发送预警。文章详细记录了从环境搭建、定时任务配置到关键词匹配和告警发送的完整流程,重点解决了crontab调用GitPython时的路径与认证问题,并提供了基于APScheduler的替代方案及完整代码示例。
问题背景与解决思路
近期线上环境发生了一起故障,研发人员在将代码部署至生产环境时,误将测试环境的地址硬编码在代码中且未进行替换,导致线上服务异常使用了测试环境地址。
尽管开发流程中制定了各类规范制度,但人为疏忽仍难以完全避免。与其事后追责,不如通过技术手段建立自动化机制来预防此类问题。
为实现上述目标,初步规划通过以下步骤构建代码关键字自动扫描与告警系统。
- 安装Python环境
- 安装Git客户端
- 安装GitPython库
- 配置定时任务(可选方案一:Linux crontab;方案二:Python APScheduler库)
- 获取Git代码仓库
- 执行关键词扫描
- 配置邮件告警通知
开发环境搭建
#安装python的依赖包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel gcc
#下载Python安装包,版本号:Python-3.7.1.tgz(在/opt下创建目录Python3)
wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
#解压安装包
tar -zxvf Python-3.8.1.tgz
#指定python3安装目录
./configure --prefix=/usr/local/python3
#编译&安装
make && make install
#创建软连接,将自定目录管理到指定目录
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
#添加环境变量
vi /etc/profile
export PATH=/usr/local/python3/bin:$PATH
source /etc/profile
#至此Python3安装完毕,通过命令验证

Git安装
#下载git安装包,版本号:2.21.0
wget https://github.com/git/git/archive/v2.21.0.tar.gz
#解压
tar -zxvf v2.21.0.tar.gz
#安装
make prefix=/usr/local/git install
#添加环境变量
vi /etc/profile
export PATH=/usr/local/git/bin:$PATH
source /etc/profile
#至此Python3安装完毕,通过命令验证

GitPython3安装
#可以采用在线安装
pip3 install GitPython
#但是我这里由于网络限制无法在线安装,只能采用手动安装
#下载依赖包,下载地址https://pypi.org/,可以根据关键字smmap、gitdb进行检索下载
smmap-3.0.4.tar.gz
gitdb-4.0.5.tar.gz
#安装
tar -zxvf smmap-3.0.4.tar.gz
cd smmap-3.0.4
python3 setup.py install
tar -zxvf gitdb-4.0.5.tar.gz
cd gitdb-4.0.5
python3 setup.py install
tar -zxvf GitPython-3.1.2
cd GitPython-3.1.2
python3 setup.py install
#安装完毕后,可以写一个demo.py进行验证
复制代码
from git.repo import Repo
import os
demo_git_path = '/opt/workspace/demo'
#定义本地目录
Repo.clone_from('http://git.***.com/demo/demo_git.git',to_path=demo_git_path, branch='master')
复制代码
#最终代码库将克隆到本地目录(执行前将demo.py赋权)
python3 demo.py
定时任务配置与问题排查
linux下配置定时任务
#定时任务采用linux的crontab来实现
#编辑定时任务
crontab -e
* * * * * python3 /opt/python3-workspace/demo.py >> /opt/python3-workspace/logs/demo.log
#前五个是时间指令,分钟(0-59)小时(0-28)日期(1-31)月份(1-12)星期几(0-6,其中0代表星期日)
#python3 是具体执行的指令 后面跟的是执行的脚本 在后面跟的是日志
#编辑保存后会立即执行
#查看当前正在运行的任务,本案例中已临时注释#
crontab -l

原计划采用Linux系统的crontab进行任务调度,但在执行GitPython相关命令时遇到了两个主要障碍。
问题一:在crontab环境中无法直接调用GitPython命令。解决方案是在crontab配置中明确指定GitPython及相关依赖的路径。

具体操作是在crontab配置文件中增加相关环境变量设置,代码片段如下,通过此修改可解决路径调用问题。
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/git/bin:/root/bin
MAILTO=root
HOME=/
问题二:在crontab中执行GitPython命令时,系统无法读取Linux环境中记录的账号密码,导致自动任务始终无法成功检出代码。由于该认证问题一直未能解决,最终决定改用Python内置的定时任务调度器来替代,具体方案见下文。
使用APScheduler替代方案
APScheduler安装
#这里由于网络限制无法在线安装,只能采用手动安装
#下载依赖包,下载地址https://pypi.org/,可以根据关键字pytz、six、tzlocal进行检索下载
pytz-2020.1.tar.gz
six-1.14.0.tar.gz
tzlocal-2.1.tar.gz
APScheduler-3.6.3.tar.gz
#安装tzlocal
tar -zxvf tzlocal-2.1.tar.gz
cd tzlocal-2.1
python3 setup.py install
#安装six
tar -zxvf six-1.14.0.tar.gz
cd six-1.14.0
python3 setup.py install
#安装pytz
tar -zxvf pytz-2020.1.tar.gz
cd pytz-2020.1
python3 setup.py install
#安装APScheduler
tar -zxvf APScheduler-3.6.3.tar.gz
cd APScheduler-3.6.3
python3 setup.py install
至次APScheduler安装完毕,写个demo验证下:


核心功能实现
git代码获取
通过Repo.clone_from获取远程代码仓库,指定master分支,将远程代码库clone到本地/opt/workspace/demo目录下,
如果当前目录不为空,则通过shutil.rmtree()进行级联删除

关键词扫描
利用os组件,实现对指定目录进行递归扫描,将符合要求的文件扩展名.css .js .ftl .properties等文件进行逐行扫描
关键词扫描其实就是利用正则表达式,对要扫描的关键词进行匹配,如果匹配成功则将目标文件名称放入到异常文件列表
详细代码如下:
import os
import re
project_git_path = '/opt/workspace/demo'
cssnum = 0
jsnum = 0
ftlnum = 0
fileList = []
pattern = re.compile(r'.test.com')
def analysiFile(pathFilename):
#print('文件名:', filename)
fo = open(pathFilename, 'r', encoding='UTF-8')
for line in fo.readlines():
match = pattern.search(line)
if match:
if(fileList.count(filename) == 0):
fileList.append(filename);
#循环打印目录下的所有文件
for parentdir, dirname, filenames in os.walk(project_git_path):
for filename in filenames:
if os.path.splitext(filename)[1] == '.css':
#分析具体文件
analysiFile(parentdir + '\\' + filename)
if os.path.splitext(filename)[1] == '.js':
#分析具体文件
analysiFile(parentdir + '\\' + filename)
if os.path.splitext(filename)[1] == '.ftl':
#分析具体文件
analysiFile(parentdir + '\\' + filename)
if os.path.splitext(filename)[1] == '.properties':
#分析具体文件
analysiFile(parentdir + '\\' + filename)
for item in fileList:
print('命中文件:', item)
print('共计:', len(fileList))
邮件告警
邮件告警即通过smtp服务将上述匹配出来的异常文件列表,发送给对应系统负责人
详细代码如下:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 第三方 SMTP 服务
mail_host = "smtp.****.com" # 设置服务器
mail_user = "*****@****.com" # 用户名
mail_pass = "*****" # 口令
sender = '*****@****.com'
receivers = ['***@***.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("Python自动化检查", 'utf-8')
message['To'] = Header("系统负责人", 'utf-8')
subject = '某系统近2个月版本内网域名检查结果'
message['Subject'] = Header(subject, 'utf-8')
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 smtplib.SMTPException:
print
"Error: 无法发送邮件"
系统部署与总结
至此,该项目所需的所有功能模块均已开发完毕。最后只需根据实际业务需求,将上述各个模块组合在一起运行即可。
由于作者为Python初学者,代码设计主要遵循顺序执行逻辑,以达成最终目的为核心,未对代码结构优化和性能提升做特别考量。
最后,利用nohup命令实现脚本的后台持续运行。
总结
到此这篇关于通过Python扫描代码关键字并进行预警的文章就介绍到这了,更多相关Python扫描代码关键字预警内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









