Python
如何在沒有 root 的情況下在埠 80 上執行 Python 3 http.server?
我想在埠 80上執行 Python 3 http.server,而不以 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.
您可以讓您的服務程序能夠使用埠 <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 程序則根本沒有。