You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:50:23