我想让一个Python程序在端口80上开始监听,但之后在没有根权限的情况下执行.有没有一种方法可以删除根目录,或者在没有根目录的情况下获得端口80?
我想让一个Python程序在端口80上开始监听,但之后在没有根权限的情况下执行.有没有一种方法可以删除根目录,或者在没有根目录的情况下获得端口80?
如果没有root权限,您将无法在端口80上打开服务器,这是操作系统级别的限制.因此,唯一的解决方案是在打开端口后删除根权限.
下面是一个在Python中删除根权限的可能解决方案:Dropping privileges in Python.一般来说,这是一个很好的解决方案,但您还必须向函数中添加os.setgroups([])
,以确保不保留根用户的组成员身份.
我复制并清理了一点代码,删除了日志(log)记录和异常处理程序,所以由您来正确处理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)