我想运行 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 进程则根本没有。