3

我想在不给 Python cap_net_raw 能力的情况下在 Linux(使用 Python)中打开一个原始套接字。我希望用户拥有这种能力,而不是程序。我正在使用 Ubuntu 12.4。

4

2 回答 2

3

能力与进程(准确地说是线程)有关,与用户无关。

正如@wheredidthatnamecomefrom所指出的,您可以利用环境功能仅使用 执行python 脚本,而无需为二进制cap_net_raw设置任何文件功能。python

您可以查看以下问题,了解如何做到这一点的一般想法。

于 2018-01-02T13:19:23.713 回答
0

我也一直在为此苦苦挣扎。似乎没有任何好的解决方法,至少对于像 python 这样的解释性语言。要么在根目录下运行,要么不捕获原始数据包:)。我唯一能想到的就是将脚本作为守护进程执行。

sudo 服务启动嗅探器

嗅探器类似于:

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 并在之后立即删除上限,但似乎 python 在实例启动之前需要权限。

还有http://www.subspacefield.org/security/privilege/code/privilege/用于降低特权,但我还没有真正看过它。

编辑 1 刚刚尝试过。它可以工作,但是如果守护进程在程序需要它之前删除了该功能,它将失败。猜猜,它需要在那里暂停一下等等

于 2014-07-13T13:32:34.507 回答