一尘不染

在Python中删除根权限

linux

我想让一个Python程序开始在端口80上侦听,但是此后无需root权限即可执行。有没有办法删除根或没有它获得端口80?


阅读 371

收藏
2020-06-02

共1个答案

一尘不染

没有root特权,您将无法在端口80上打开服务器,这是对OS级别的限制。因此,唯一的解决方案是在打开端口后放弃root特权。

这是在Python中删除
root特权的可能解决方案:在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)
2020-06-02