#python #linux #subprocess #linux-capabilities
#python #linux #подпроцесс #linux-возможности
Вопрос:
Я использую программу для выдачи команды 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 permittedn')
$ 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 permittedn')
$ 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 existsn')
если CAP_NET_ADMIN
процессу разрешено изменять сетевые интерфейсы, а i
флаг, указанный в setcap
, указывает, что подпроцессы должны наследовать возможности, предоставленные исполняемому файлу, почему я все еще получаю ошибку «операция не разрешена». Я ожидал бы получить ошибку File exists, как я делаю выше при запуске python через sudo.
Комментарии:
1. Судя по этой статье , по крайней мере, совсем недавно, в 2015 году, возможности не наследовались через
execve()
вызов.