如何拦截Linux设备发出的所有请求并查看Python脚本的HTTP请求明细?
Linux下抓取HTTP请求的实现方案
分两种场景提供对应方案,你可以根据需求选择:
方案1:仅抓取指定Python脚本的请求(无冗余数据,精准度最高)
适合只需要查看目标Python脚本发起的请求的场景,无需抓全设备流量,用strace跟踪进程的网络发送系统调用即可:
- 启动脚本时直接跟踪
strace -f -e trace=sendto,sendmsg -s 2048 python3 your_script.py 2>&1 | grep -E '(GET|POST|PUT|DELETE|HEAD|OPTIONS|PATCH|Host:|User-Agent:|Accept:|Authorization:|Cookie:)'
参数说明:
-f跟踪所有子进程/子线程,避免脚本异步发请求时漏抓-e trace=sendto,sendmsg仅过滤网络发送相关的系统调用,排除大量无关本地IO日志-s 2048调整字符串截断长度为2048,避免长请求头、请求路径被默认截断- 后面的grep规则可以自定义,新增你需要提取的其他请求头字段即可
- 脚本已运行时动态绑定
先通过ps aux | grep your_script.py获取目标进程的PID,再执行:
strace -f -e trace=sendto,sendmsg -s 2048 -p 替换为你的进程PID 2>&1 | grep 上述过滤规则
方案2:抓取设备所有HTTP/HTTPS请求
需要查看全设备的出站请求时,用tcpdump或tshark抓包即可:
明文HTTP请求抓取
用tcpdump直接抓80端口流量,过滤请求相关内容:
tcpdump -i any -A -s 0 'tcp port 80' | grep -E '(GET|POST|PUT|DELETE|HEAD|OPTIONS|PATCH|Host:|User-Agent:|Accept:|Authorization:|Cookie:)'
参数说明:
-i any监听所有网卡的流量-A以ASCII格式输出包内容,可直接读取文本-s 0不截断包内容,完整抓取所有请求数据
HTTPS请求明文抓取
HTTPS流量默认加密,需要配合SSL密钥日志才能解密查看明文内容:
- 先在终端设置环境变量,启动Python脚本前执行:
export SSLKEYLOGFILE=~/ssl_keys.log
Python的requests、urllib等标准请求库都会自动将TLS握手密钥写入这个文件
2. 用tshark抓包并自动解密:
tshark -i any -f 'tcp port 443' -o ssl.keylog_file:$HOME/ssl_keys.log -T fields -e http.request.method -e http.host -e http.request.uri -e http.request.line -E separator=' | '
执行后会直接输出每条请求的方法、域名、请求路径、完整请求头内容。
补充方案:代码层面直接打印请求
如果你有Python脚本的修改权限,直接加请求钩子更简单,不需要额外系统命令,以requests库为例:
import requests def log_request(resp, *args, **kwargs): print(f"请求方法:{resp.request.method}") print(f"请求地址:{resp.request.url}") print("请求头:") for k, v in resp.request.headers.items(): print(f" {k}: {v}") print("-"*60) # 发请求时指定钩子即可 requests.get("https://example.com", hooks={"response": log_request})
内容的提问来源于stack exchange,提问作者Alen
相关产品推荐
相关产品推荐

