linux-在Python中删除根权限

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

6个解决方案

57 votes

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

这是在Python中删除root特权的可能解决方案:在Python中删除特权。 通常,这是一个很好的解决方案,但是您还必须在函数中添加OSError,以确保不保留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)

Tamás answered 2020-06-24T07:07:44Z

12 votes

我建议使用authbind来启动您的Python程序,因此无需以root用户身份运行。

[HTTPS://恩.Wikipedia.org/wiki/AU TH bind]

Allen answered 2020-06-24T07:08:08Z

7 votes

每当我需要放弃特权时,要求用户输入他/她的用户名和组不是一个好主意。 这是Tamás代码的略微修改版本,它将删除特权并切换到发起sudo命令的用户。 我假设您正在使用sudo(如果没有,请使用Tamás的代码)。

#!/usr/bin/env python3

import os, pwd, grp

#Throws OSError exception (it will be thrown when the process is not allowed

#to switch its effective UID or GID):

def drop_privileges():

if os.getuid() != 0:

# We're not root so, like, whatever dude

return

# Get the uid/gid from the name

user_name = os.getenv("SUDO_USER")

pwnam = pwd.getpwnam(user_name)

# Remove group privileges

os.setgroups([])

# Try setting the new uid/gid

os.setgid(pwnam.pw_gid)

os.setuid(pwnam.pw_uid)

#Ensure a reasonable umask

old_umask = os.umask(0o22)

#Test by running...

#./drop_privileges

#sudo ./drop_privileges

if __name__ == '__main__':

print(os.getresuid())

drop_privileges()

print(os.getresuid())

Autodidact answered 2020-06-24T07:08:29Z

4 votes

systemd可以为您完成此任务,如果您通过systemd启动程序,则systemd可以将已经打开的侦听套接字移交给它,它也可以在首次连接时激活您的程序。 而且您甚至不需要守护它。

如果要使用独立方法,则需要功能CAP_NET_BIND_SERVICE(请参阅功能手册页)。 这可以使用正确的命令行工具在逐个程序的基础上完成,或者通过使应用程序(1)成为suid root(2)启动(3)监听端口(4)立即放弃特权/功能来完成 。

请记住,suid根程序带有很多安全注意事项(干净安全的环境,umask,特权,rlimit,所有这些都是程序必须正确设置的东西)。 如果可以使用诸如systemd之类的方法,那就更好了。

Rudd-O answered 2020-06-24T07:08:59Z

2 votes

除非您在执行其他不想成为超级用户的操作后需要请求套接字,否则大多数方法都可以使用。

不久前,我做了一个名为tradesocket的项目。 它允许您在进程之间在posix系统上来回传递套接字。 我要做的是从一开始就分离一个保留超级用户的进程,而其余的进程则放弃权限,然后从另一个进程请求套接字。

Brantley Harris answered 2020-06-24T07:09:24Z

2 votes

以下是塔玛斯答案的进一步改编,但作了以下更改:

使用HOME模块将Linux功能放到要保留的功能指定列表中。

可以选择将用户作为参数传递(默认为查找运行HOME的用户)。

它设置所有用户的组和HOME。

它可以选择更改目录。

(但是,我刚开始使用此功能,所以我可能错过了一些东西。它可能不适用于较旧的内核(<3.8)或禁用了文件系统功能的内核。)

def drop_privileges(user=None, rundir=None, caps=None):

import os

import pwd

if caps:

import prctl

if os.getuid() != 0:

# We're not root

raise PermissionError('Run with sudo or as root user')

if user is None:

user = os.getenv('SUDO_USER')

if user is None:

raise ValueError('Username not specified')

if rundir is None:

rundir = os.getcwd()

# Get the uid/gid from the name

pwnam = pwd.getpwnam(user)

if caps:

prctl.securebits.keep_caps=True

prctl.securebits.no_setuid_fixup=True

# Set user's group privileges

os.setgroups(os.getgrouplist(pwnam.pw_name, pwnam.pw_gid))

# Try setting the new uid/gid

os.setgid(pwnam.pw_gid)

os.setuid(pwnam.pw_uid)

os.environ['HOME'] = pwnam.pw_dir

os.chdir(os.path.expanduser(rundir))

if caps:

prctl.capbset.limit(*caps)

try:

prctl.cap_permitted.limit(*caps)

except PermissionError:

pass

prctl.cap_effective.limit(*caps)

#Ensure a reasonable umask

old_umask = os.umask(0o22)

可以如下使用:

drop_privileges(user='www', rundir='~', caps=[prctl.CAP_NET_BIND_SERVICE])

Craig McQueen answered 2020-06-24T07:10:10Z

python可删除用户程序_linux-在Python中删除根权限相关推荐

  1. cte公用表表达式_CTE SQL删除; 在SQL Server中删除具有公用表表达式的数据时的注意事项

    cte公用表表达式 In this article, the latest in our series on Common table expressions, we'll review CTE SQ ...

  2. python 去掉文件后缀_python从zip中删除指定后缀文件(推荐)

    一,说明 环境:python2 用到的模块 os zipfile shutil 程序功能:从zip中删除指定后缀的文件,然后再自动压缩 函数说明: DelFileInZip(path,suffix) ...

  3. python字符串去掉空行_Python从字符串中删除空格

    python字符串去掉空行 There are various ways to remove spaces from a string in Python. This tutorial is aime ...

  4. python的csv模块自动删除空白_从CSV中删除空白行?

    我有一个很大的csv文件,其中有些行是完全空白的.如何使用Python从csv中删除所有空白行? 经过你的建议,这就是我到目前为止所拥有的import csv # open input csv for ...

  5. python zipfile模块,关于python:使用ZipFile模块从zipfile中删除文件

    我想从zip文件中删除文件的唯一方法是创建一个临时zipfile,而不删除该文件,然后将其重命名为原始文件名. 在python 2.4中,ZipInfo类具有属性file_offset,因此可以创建第 ...

  6. linux下python开发环境搭建_linux下python开发环境之二——安装Eclipse+PyDev

    Eclipse是由java开发的,所以要想让Eclipse跑起来就得安装jdk,在命令行里输入javac就能查看本机是否已经安装好了jdk了. 1.安装jdk 先从oracle官网上下载jdk,放到/ ...

  7. python程序开机自启动_Linux下Python脚本自启动和定时启动的详细步骤

    一.Python开机自动运行 假如Python自启动脚本为 auto.py .那么用root权限编辑以下文件: sudo vim /etc/rc.local 如果没有 rc.local 请看 这篇文章 ...

  8. php 从数组里删除元素,PHP从数组中删除元素的四种方法实例

    PHP从数组中删除元素的四种方法实例 一.总结 一句话总结:unset(),array_splice(),array_diff(),array_diff_key() 二.PHP从数组中删除元素的四种方 ...

  9. java类怎么删除对象_在java中删除一个对象?

    在java中删除一个对象? 我想删除一个我创build的对象(跟随着你的一个椭圆),但是我怎么做呢? delete follower1; 没有工作. 编辑: 好吧,我会给更多的上下文. 我正在制作一个 ...

  10. mysql for 循环删除_Java增强for循环中删除元素抛异常问题

    前言 最近突然想起刚毕业那会找工作时面试被问了个这样的问题.就是"使用增强for循环遍历ArrayList(List集合)时删除其中的元素是否会出现异常?".说实话当时真把我愣住了 ...

最新文章

  1. pythondocx批量提取目录及内容_使用pythondocx搜索目录中的所有docx文件(批处理)...
  2. 【Python】写视频的2种常用方法:write_videofile和videoWrite
  3. 【研发管理】结构化流程框架
  4. linux变量赋值用中括号,Shell脚本定义变量和重新赋值
  5. .NET Core微服务开发服务间调用篇-GRPC
  6. 苹果:App Store中国区无版号游戏8月1日起下架;美国计划打造量子互联网;HHVM 4.67 发布 | 极客头条...
  7. php 替换alt,PHP 实现自动添加或者替换 内容的IMG标签的 alt title 属性
  8. C语言行列中大小判断,c语言判断两个矩阵是否相等(行列相同的矩阵)
  9. 电脑文件夹同步软件哪个比较好用?
  10. 大四学生发明文言文编程语言,脑洞新奇
  11. Java项目:SSM校园共享自行车出租管理系统
  12. 《Renewable Energy》论文格式
  13. 家谱系统php,家谱信息管理系统
  14. Mysql优化-02
  15. H5页面调用微信支付
  16. 华为云服务器不显示盘符,云服务器只有一个盘符可以
  17. SDL编程入门(28)每像素碰撞检测
  18. 开箱即用的百度开放域信息抽取的统一框架UIE
  19. R语言中dcast 和 melt的使用 简单易懂
  20. Big-man酷谈overflow

热门文章

  1. “烧烤模式”下 安防设备如何经得住考验?
  2. 如何在 Sony Playstation 3 安装 Fedora 9
  3. 程序员最恐怖的梦魇是什么?
  4. WPF 作为弹出框的window设置DialogResult时抛异常问题
  5. 珠三角节前返乡客流持续走高
  6. 使用python与tensorflow实现的简易alpha-go
  7. 【嵌入式】---- RCC
  8. mmall数据库学习笔记
  9. 吴恩达2022机器学习专项课测评来了!
  10. 计算机教授晚年凄凉,晚年过得凄凉被抛弃的老人,往往有2个共性,纯属自食恶果...