Unix服务器使用Python http.server时,如何在日志中捕获用户名/ID替代IP
问题解决思路:给Python简易HTTP服务器添加用户身份捕获与访问限制
一、直接捕获用户名到日志的可行方案
Python自带的http.server默认不做用户认证,因此日志里的用户名位置始终是-。要实现捕获用户名的需求,核心是先给服务器加上用户认证环节,让用户必须输入账号密码才能访问,认证通过后将用户名写入日志。
1. 自定义带认证的HTTP服务器脚本
写个简单的脚本替代默认的http.server,同时实现认证和自定义日志格式:
from http.server import HTTPServer, SimpleHTTPRequestHandler import base64 # 可配置的合法用户列表(建议后续从文件/数据库读取) VALID_USERS = { "username1": "password1", "username2": "password2" } class AuthRequestHandler(SimpleHTTPRequestHandler): def do_AUTHHEAD(self): self.send_response(401) self.send_header('WWW-Authenticate', 'Basic realm="File Download Server"') self.send_header('Content-type', 'text/html') self.end_headers() def do_GET(self): # 检查请求头中的认证信息 auth_header = self.headers.get('Authorization') if not auth_header or not auth_header.startswith('Basic '): self.do_AUTHHEAD() self.wfile.write(b'请先完成身份认证') return # 解码账号密码 auth_decoded = base64.b64decode(auth_header.split(' ')[1]).decode('utf-8') username, password = auth_decoded.split(':', 1) # 验证用户合法性 if VALID_USERS.get(username) != password: self.do_AUTHHEAD() self.wfile.write(b'账号或密码错误') return # 认证通过,记录当前用户名 self.current_user = username super().do_GET() def log_message(self, format, *args): # 重写日志生成方法,替换原格式中的第二个'-'为用户名 self.log_file.write(f"{self.address_string()} - {self.current_user} - [{self.log_date_time_string()}] {format % args}\n") if __name__ == '__main__': server = HTTPServer(('0.0.0.0', 8000), AuthRequestHandler) print('服务器运行在8000端口') server.serve_forever()
运行该脚本替代原命令:
python -u custom_server.py &> log_file & echo $! > pid_file
此时日志会自动生成为你期望的格式,示例:10.166.00.000 - username1 - [16/Feb/2023 03:54:14] "GET / HTTP/1.1" 200 -
2. 反向代理+认证方案(无需修改Python代码)
如果不想改动服务器脚本,可以用Nginx做前置代理:
- 在Nginx配置中开启
auth_basic认证,设置合法用户列表 - 自定义Nginx日志格式,将认证后的
$remote_user(用户名)写入日志 - 将请求转发到本地运行的Python HTTP服务器(
http://localhost:8000)
这种方式无需修改Python代码,适合快速搭建带认证的访问入口。
二、更高效的访问限制方案
除了捕获用户名后手动封禁,还有更直接的安全管控方式:
- IP级别的黑白名单:如果用户IP相对固定,直接用
iptables或ufw限制IP访问,比如封禁违规IP:
iptables -A INPUT -s 10.166.00.000 -p tcp --dport 8000 -j DROP
- 行为触发式封禁:在自定义服务器脚本中添加规则,比如记录用户的访问频率、访问路径,一旦触发违规条件(如频繁下载、访问敏感文件),直接拒绝后续请求,或调用系统命令封禁其IP。
- 替换为专业Web服务器:如果追求长期稳定性和安全性,建议用Nginx、Apache替代Python简易服务器,这类工具自带完整的认证、日志、限流、访问控制功能,配置更灵活。
三、关键注意事项
- HTTP基础认证的密码仅做base64编码,并非加密,建议配合HTTPS使用(可通过
openssl生成证书,在自定义脚本中添加HTTPS支持) - 合法用户列表不要硬编码在脚本里,建议存在外部文件或数据库,方便后续维护和更新
内容的提问来源于stack exchange,提问作者shanaya sharma
相关产品推荐
相关产品推荐

