Вы не сможете открыть сервер на порту 80 без привилегий root, это ограничение на уровне ОС.Поэтому единственное решение - удалить привилегии root после того, как вы открыли порт.
Вот возможное решение для удаления привилегий root в Python: Удаление привилегий в Python .В общем, это хорошее решение, но вам также необходимо добавить os.setgroups([])
в функцию, чтобы гарантировать, что членство в группе пользователя root не сохраняется.
Я скопировал и очистил код aнемного, и удалил журналирование и обработчики исключений, так что вам остается правильно обработать OSError
(оно будет выброшено, когда процессу не разрешено переключать свой эффективный UID или GID):
import os, pwd, grp
def drop_privileges(uid_name='nobody', gid_name='nogroup'):
if os.getuid() != 0:
# We're not root so, like, whatever dude
return
# Get the uid/gid from the name
running_uid = pwd.getpwnam(uid_name).pw_uid
running_gid = grp.getgrnam(gid_name).gr_gid
# Remove group privileges
os.setgroups([])
# Try setting the new uid/gid
os.setgid(running_gid)
os.setuid(running_uid)
# Ensure a very conservative umask
old_umask = os.umask(077)