我想在Linux(使用Python)中打开一个原始套接字,而不给Python提供cap_net_raw功能。我希望用户拥有此功能,而不是程序。我正在使用Ubuntu 12.4。
答案 0 :(得分:0)
我也一直在努力解决这个问题。似乎没有任何好的解决方法,至少对于像python这样的解释性语言。要么以root身份运行,要么不要捕获原始数据包:)。我唯一能想到的就是将脚本作为守护进程执行。
sudo service start snifferd
其中snifferd类似于:
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/home/<user>/projects/sniffer.py
DAEMON_NAME=snifferd
case "$1" in
start)
log_daemon_msg "Starting $DAEMON_NAME"
setcap cap_net_raw=+ep /usr/bin/python2.7
start-stop-daemon --start --background --pidfile $PIDFILE --make-pid --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON
setcap cap_net_raw=-ep /usr/bin/python2.7
log_end_msg $?
;;
...
我在初始化套接字之前尝试在我的代码中执行setcap,并在之后删除了cap,但似乎python在实例启动之前需要权限。
还有http://www.subspacefield.org/security/privilege/code/privilege/因为我没有真正看过它。
编辑1 刚试了一下。它可以工作,但如果deamon在程序需要之前删除了该功能,它将失败。猜猜看,它需要某种停顿等等。
答案 1 :(得分:0)
功能与进程(线程准确)有关,而与用户无关。
正如@wheredidthatnamecomefrom所指出的,您可以利用环境功能仅使用cap_net_raw
执行python脚本,而无需为python
二进制文件设置任何文件功能。
您可以查看the following question有关如何执行此操作的一般概念。