Отбрасывание корневых полномочий в Python

Я хотел бы иметь программу Python, начинают слушать на порте 80, но после этого выполняются без корневых полномочий. Существует ли способ отбросить корень или получить порт 80 без него?

46
задан Autodidact 11 April 2014 в 10:19
поделиться

1 ответ

Вы не сможете открыть сервер на 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)
57
ответ дан 26 November 2019 в 20:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: