如何在没有 root 的情况下在端口 80 上运行 Python 3 http.server?

如何在没有 root 的情况下在端口 80 上运行 Python 3 http.server?

我想运行 Python 3http服务器端口80,没有以 root 身份运行它,无需安装任何额外的软件(例如 authbind)。我正在使用 Arch Linux。如果可能的话,我更愿意使用 systemd 来完成此操作,并让它在启动时自动启动。

我做了这个简单的包装:

#!/bin/sh
cd /srv/http/mywebsite/
python -m http.server 80

我可以使用这个单元文件运行它:

[Unit]
Description=Python 3 http.server

[Service]
Type=simple
ExecStart=/usr/local/bin/website_start.sh

[Install]
WantedBy=multi-user.target

这“有效”,但并不安全。如果我添加用户和组,则会失败并显示“权限被拒绝”(我猜是因为端口 80 需要 root 权限)。

[Unit]
Description=Python 3 http.server

[Service]
Type=simple
ExecStart=/usr/local/bin/website_start.sh
User=http
Group=http

[Install]
WantedBy=multi-user.target

错误是:

Jun 23 00:58:57 myvps systemd[43060]: http_python_server.service: Failed to execute command: Permission denied

Jun 23 00:58:57 myvps systemd[43060]: http_python_server.service: Failed at step EXEC spawning /usr/local/bin/website_start.sh: Permission denied

error: connect_to website port 80: failed.

答案1

您可以授予服务进程使用 <1024 端口的能力,但没有其他 root 权限:

[Unit]
Description=Python 3 http.server

[Service]
Type=simple
ExecStart=/usr/local/bin/website_start.sh
User=http
Group=http
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

man 7 capabilities如果您想了解更多信息,请阅读。

/sbin/getpcaps命令可用于通过 PID 查询进程可用的功能。通常,root 拥有的进程具有一长串功能,而非 root 进程则根本没有。

相关内容