2016-07-12 167 views
1

我正在尝试给脚本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没有任何效果,并不知道如何调试这一点。

+1

我会说,这是蟒蛇希望使用特权端口,而不是shell脚本执行的Python程序。 –

+0

就是这样。奇怪的是,因为我认为-i意味着“继承”,所以任何子进程或bash脚本的执行者也将具有这些能力。 –

回答

0

应用于脚本(包含shebang头文件的可执行文件)的文件功能不会产生任何影响。相反,您需要将这些功能应用于用于执行脚本的二进制解释器(通常是shebang头文件中提到的命令)。

在你的情况下,只需将能力应用于python可执行文件。

1

setcap(8)仅设置文件的功能。谈到口译人员时,我认为你很难过。功能(7) - 我正在阅读RHEL 7.4 - 列出“线程”功能集以及“文件”功能。在“线程”功能集中,有一个“Ambient”集合以及“Inheritable”的概念。重要的区别在于,'以非root用户身份运行时,execve(2)通常不会保留可继承的功能“,您应该设置Ambient功能集。

注意:RHEL 7(7.4)有这个backported。 “环境”功能显然在Linux 4.3中出现,而RHEL 7名义上是3.10系列内核。

我遇到了类似的问题,除了我试图在Systemd下使用Python服务器。我发现我需要设置'环境'功能集。我想这是被继承的东西。下面是一个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 

感谢您的提问。它给了我一个学习更多的机会。

干杯, 卡梅伦