Я хотел бы иметь программу Python, начинают слушать на порте 80, но после этого выполняются без корневых полномочий. Существует ли способ отбросить корень или получить порт 80 без него?
Вы не сможете открыть сервер на 80-м порту без прав суперпользователя, это ограничение на уровне ОС. Таким образом, единственное решение - отказаться от привилегий root после того, как вы откроете порт.
Вот возможное решение для отказа от привилегий root в Python: Удаление привилегий в Python . В целом это хорошее решение, но вам также необходимо добавить в функцию os.setgroups ([])
, чтобы гарантировать, что членство в группе пользователя root не сохраняется.
Я скопировал и немного очистил код, а также удалил ведение журнала и обработчики исключений, так что вы сами должны правильно обрабатывать 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)