我想让一个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)

Linux相关问答推荐

eBPF:仅使用系统调用加载 eBPF 程序并将其附加到 sys_enter_execve

为什么waitpid(2)可以指定非子进程?

从 ALSA USB 硬件设备获取 USB 设备文件路径

Linux BlueZ 5.65 hcitool 结合服务 UUID 和制造数据广告

从 curl 命令输出中获取值

最小的 x86_64 Hello World ELF 二进制文件是什么?

如何为 Linux 构建 Visual C++ 项目?

如何在 Linux 中设置目录大小限制?

Linux 应用程序分析

在 64 位 Linux 操作系统上编译 32 位程序导致致命错误

有没有办法在整个项目代码中的某个日期之后找出更改的文件?

如何分析内存使用情况?

Linux 中的直接内存访问

根据日期范围过滤日志(log)文件条目

`是什么意思! -d` 在这个 Bash 命令中?

比较两个图像的 python/linux 方式

Windows 开发环境值得付出代价吗?

如何在 UNIX 中将字符串转换为整数

find -name "*.xyz" -o -name "*.abc" -exec 对所有找到的文件执行,而不仅仅是指定的最后一个后缀

Bash:等待超时