求助:无需root/sudo权限运行Linux下Python网络抓包代码
解决Scapy抓包脚本无需sudo直接运行的问题
核心原因
Scapy捕获网络流量需要使用原始套接字,这类操作默认仅root用户有权限,普通用户直接运行会因权限不足失败。以下是两种可行的解决方案:
方法1:给Python二进制文件添加网络权限(推荐)
利用Linux的capabilities机制,给Python程序单独赋予抓包所需的权限,无需全局sudo:
- 先找到Python3.8的二进制文件路径:
which python3.8
通常输出为/usr/bin/python3.8
- 给该文件添加抓包必需的权限:
sudo setcap cap_net_raw,cap_net_admin+eip /usr/bin/python3.8
cap_net_raw:允许创建原始套接字,满足抓包基础需求cap_net_admin:支持Scapy部分高级网络操作+eip:让权限可以继承到Python的子进程
- 验证权限是否生效:
getcap /usr/bin/python3.8
正常输出应为:/usr/bin/python3.8 = cap_net_admin,cap_net_raw+eip
完成后直接执行python3 test.py即可正常抓包。
方法2:通过SUID包装脚本实现(不推荐,有安全风险)
若仅做临时测试,可通过shell脚本包装实现SUID权限,但该方式存在安全隐患,仅建议在受控环境使用:
- 创建一个shell包装脚本
run_capture.sh:
#!/bin/bash /usr/bin/python3.8 /绝对路径/test.py
替换/绝对路径/test.py为你的脚本实际路径
- 赋予脚本执行权限并设置SUID:
sudo chmod u+s run_capture.sh sudo chmod +x run_capture.sh
- 直接运行包装脚本:
./run_capture.sh
⚠️ 注意:SUID脚本若被篡改,攻击者可获取root权限,生产环境禁止使用。
额外注意事项
- 确保脚本中
/path_to_capture目录对当前用户有写入权限,否则保存pcap文件会失败,可执行以下命令修改权限:
sudo chown $USER:$USER /path_to_capture sudo chmod 755 /path_to_capture
- 若后续Python版本更新,需要重新执行
setcap命令给新的Python二进制文件添加权限。
内容的提问来源于stack exchange,提问作者AHSAN YAZDANI
相关产品推荐
相关产品推荐

