Я пытаюсь дать сценарий cap_net_bind_service Linux capability. Однако использование setcap не работает.Сценарий с cap_net_bind_service не может прослушивать порт 80
$ cat listen.sh
#!/bin/bash
python -m SimpleHTTPServer 80
$ getcap listen.sh
listen.sh =
$ sudo setcap cap_net_bind_service=+eip ./listen.sh
$ getcap listen.sh
listen.sh = cap_net_bind_service+eip
$ ls -al listen.sh
-rwxrwxr-x. 1 eric eric 43 Jul 11 23:01 listen.sh
$ ./listen.sh
Traceback (most recent call last):
File "/usr/lib64/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
...
File "/usr/lib64/python2.7/SocketServer.py", line 434, in server_bind
self.socket.bind(self.server_address)
File "/usr/lib64/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 13] Permission denied
Использование sudo все еще работает нормально.
$ sudo ./listen.sh
Serving HTTP on 0.0.0.0 port 80 ...
Это на рабочей станции Fedora 23.
$ cat /proc/version
Linux version 4.4.9-300.fc23.x86_64 ([email protected]) (gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)) #1 SMP Wed May 4 23:56:27 UTC 2016
Я немного потерял в этот момент, попытались выключая firewalld никакого эффекта, и не могу понять, как отладить это.
Я бы сказал, это питон, который хочет использовать привилегированный порт, а не оболочка-скрипт, который выполняет программу питона. –
Вот и все. Нечетный, потому что я думал, что -i означает «унаследованный», поэтому любые дочерние процессы или исполнители сценария bash также будут иметь возможности. –