我正在尝试给脚本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没有任何效果,并不知道如何调试这一点。
我会说,这是蟒蛇希望使用特权端口,而不是shell脚本执行的Python程序。 –
就是这样。奇怪的是,因为我认为-i意味着“继承”,所以任何子进程或bash脚本的执行者也将具有这些能力。 –