루트 없이 포트 80에서 Python 3 http.server를 실행하는 방법은 무엇입니까?

루트 없이 포트 80에서 Python 3 http.server를 실행하는 방법은 무엇입니까?

Python 3을 실행하고 싶습니다.http 서버존재하다포트 80,아니요추가 소프트웨어(예: authbind)를 설치하지 않고 루트로 실행합니다. 저는 아치 리눅스를 사용하고 있습니다. 가능하다면 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에는 루트 권한이 필요하기 때문인 것 같습니다).

[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를 사용하는 기능을 부여할 수 있지만 다른 루트 권한은 부여할 수 없습니다.

[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별로 프로세스에 사용 가능한 기능을 쿼리하는 데 사용할 수 있습니다. 일반적으로 루트 소유 프로세스에는 많은 기능 목록이 있지만 루트가 아닌 프로세스에는 전혀 기능이 없습니다.

관련 정보