Linux 带有cap#net_bind_服务的脚本可以';不要在端口80上侦听

Linux 带有cap#net_bind_服务的脚本可以';不要在端口80上侦听,linux,linux-capabilities,Linux,Linux Capabilities,我正在尝试为脚本提供cap\u net\u bind\u服务。然而,使用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

我正在尝试为脚本提供cap\u net\u bind\u服务。然而,使用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,但没有效果,也不知道如何调试它。

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

在您的情况下,只需将这些功能应用于python可执行文件。

setcap(8)仅设置文件上的功能。谈到口译员,我认为你的处境很艰难。功能(7)——我正在阅读RHEL7.4——列出了“线程”功能集以及“文件”功能。在“线程”能力集中,有“环境”能力集和“可继承”能力集的概念。重要的区别在于“当以非根用户身份运行时,可继承的功能通常不会在execve(2)中保留”,您应该设置环境功能集

注:RHEL 7(7.4)具有此后端口Ambient的功能显然出现在Linux4.3中,RHEL7名义上是一个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
谢谢你的提问。这给了我一个学习更多的机会

关于环境能力如何在实践中发挥作用的进一步阅读,请参阅

干杯,
Cameron

我想说,是python想要使用特权端口,而不是执行python程序的shell脚本。就是这样。奇怪的是,因为我认为-我的意思是“继承的”,所以bash脚本的任何子进程或执行器都将具有这些功能。