Я использую программу для выдачи команды 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
, указывает, что подпроцессы должны наследовать возможности, предоставленные исполняемому файлу, почему я все еще получаю ошибку «Операция не разрешена». Я ожидаю получить сообщение об ошибке «Файл существует», как я делал выше при запуске python через sudo.