【问题标题】:Using setcap on /usr/bin/python2.7 does not provide subtask with rights在 /usr/bin/python2.7 上使用 setcap 不会为子任务提供权限
【发布时间】:2017-09-21 12:38:22
【问题描述】:

我(我们)正在使用 python 创建数据包并捕获回复以测试网络设备。 为了提供我使用过的 python 功能:

sudo setcap cap_net_admin,cap_net_raw+eip /usr/bin/python2.7

当我检查功能时,设置看起来没问题:

getcap /usr/bin/python2.7
/usr/bin/python2.7 = cap_net_admin,cap_net_raw+eip

如果我运行我的脚本,我会收到以下错误:

dumpcap: The capture session could not be initiated on interface 'eth2' (You don't have permission to capture on that device).
Please check to make sure you have sufficient permissions, and that you have the proper interface or pipe specified.

如果我直接通过以下方式为 dumpcap 提供功能:

sudo setcap cap_net_admin,cap_net_raw=eip /usr/bin/dumpcap

这使脚本运行,但它并不能解决我的 python 无法使用 cap_net_admin 的问题。

有什么方法可以检查我正在运行的 python 进程是否获得了正确的功能?或者为什么python2.7似乎没有继承我系统上的功能?

为了确保调用正确的文件/进程,我使用 /usr/bin/python2.7 作为可执行文件来调用。 相同的 python 代码适用于我公司的其他人。 我正在运行 Ubuntu 16.04。 问候

【问题讨论】:

  • 听起来您的脚本正在通过 python 脚本中的 exec 调用 dumpcap,这意味着它丢失了 cap_net_admin,因为默认情况下功能不会跨越 exec

标签: python linux linux-capabilities


【解决方案1】:

正如@Petesh 所指出的,您的脚本可能会调用子进程,这涉及调用exec() 并且子进程的有效集合中没有提高功能。您可以通过利用环境功能来解决此问题,这些是available for kernel 4.3+ - 即 Ubuntu 16.04 就足够了。简单地说,环境功能在exec() 中保留,因此传递给子进程。要启动具有环境功能的进程,您可以使用以下实用程序:https://gist.github.com/tomix86/32394a43be70c337cbf1e0c0a56cbd8d

要检查给定流程的能力集,您可以使用

grep Cap /proc/[pid]/status

其中 CapEff 是有效的能力集,要解码这些十六进制字符串,您可以使用 capsh

【讨论】:

    猜你喜欢
    • 2016-02-19
    • 2015-02-03
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多