我正在尝试给脚本cap_net_bind_service Linux capability。但是使用setcap似乎不起作用。
$ 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 (mockbuild@bkernel02.phx2.fedoraproject.org) (gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC) ) #1 SMP Wed May 4 23:56:27 UTC 2016
此时我有点失落,试图关闭firewalld无效,并且无法弄清楚如何调试它。
答案 0 :(得分:2)
setcap(8)仅设置文件的功能。谈到口译员,我认为你是在艰难的旅程中。功能(7) - 我正在阅读RHEL 7.4 - 列出'Thread'功能集和'File'功能。在“线程”功能集中,有一个“环境”集的概念,以及“可继承”。重要的区别是“作为非root用户运行时,execve(2)中通常不会保留可继承的功能”,您应该设置Ambient功能集。
注意:RHEL 7(7.4)已向后移植。 “环境”功能显然出现在Linux 4.3中,而RHEL 7名义上是3.10系列内核。
我遇到了类似的问题,除了我试图在Systemd下使用Python服务器。我发现我需要设置'Ambient'功能集。我想这就是继承的东西。以下是Systemd单元文件的示例:
[Unit]
Description=Docker Ident Service
After=network.target
Wants=docker.service
[Service]
Type=simple
ExecStart=/usr/local/sbin/docker-identd
Restart=on-failure
RestartSec=43s
User=docker-identd
Group=docker
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
Nice=12
StandardOutput=syslog
StandardError=syslog
SyslogFacility=daemon
SyslogIdentifier=docker-identd
SyslogLevel=info
[Install]
WantedBy=multi-user.target
感谢您的提问。它给了我一个学习更多东西的机会。
干杯, 卡梅伦
答案 1 :(得分:0)
应用于脚本的文件功能(带有shebang标头的可执行文件)不会产生任何影响。相反,您需要将这些功能应用于用于执行脚本的二进制解释器(通常是shebang标头中提到的命令)。
在您的情况下,只需将功能应用于python
可执行文件。