我正在使用一个程序通过子进程模块发出tc命令,但是tc正在输出RTNETLINK answers: Operation not permitted
为解决此问题,我为Python提供了CAP_NET_ADMIN
标志,具有epi
功能,但是我仍然无法发出tc命令。
$ getcap /usr/bin/python3.5
$ /usr/bin/python3.5 test-capabilities.py
CompletedProcess(args=['tc', 'qdisc', 'add', 'dev', 'eth0', 'root', 'pfifo'], returncode=2, stdout=b'', stderr=b'RTNETLINK answers: Operation not permitted\n')
$ sudo setcap cap_net_admin+eip /usr/bin/python3.5
$ /usr/bin/python3.5 test-capabilities.py
CompletedProcess(args=['tc', 'qdisc', 'add', 'dev', 'eth0', 'root', 'pfifo'], returncode=2, stdout=b'', stderr=b'RTNETLINK answers: Operation not permitted\n')
$ sudo /usr/bin/python3.5 test-capabilities.py
CompletedProcess(args=['tc', 'qdisc', 'add', 'dev', 'eth0', 'root', 'pfifo'], returncode=2, stdout=b'', stderr=b'RTNETLINK answers: File exists\n')
如果CAP_NET_ADMIN
允许进程修改网络接口,并且+i
中的setcap
标志指示子进程应继承赋予可执行文件的功能,为什么我仍然得到不允许操作错误。我希望得到文件存在错误,就像我通过sudo运行python时所做的那样。