Python删除进程用户权限(获取用户权限、用户权限,设置用户权限、用户权限)

本文深入探讨了Python中如何使用os、pwd和grp模块实现权限下降,通过drop_privileges函数,从root用户切换到指定的普通用户,确保程序运行在更安全的权限级别下。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os
import argparse
import logging
import sys
import pwd
import grp
from configparser import ConfigParser, NoSectionError, NoOptionError


def drop_privileges(uid_name=None, gid_name=None):
    if uid_name is None:
        uid_name = 'nobody'

    try:
        wanted_user = pwd.getpwnam(uid_name)
    except KeyError:
        logger.exception(
            'Cannot drop privileges: user "{}" does not exist.'.
            format(uid_name))
        sys.exit(1)

    if gid_name is None:
        gid_name = grp.getgrgid(wanted_user.pw_gid).gr_name

    try:
        wanted_group = grp.getgrnam(gid_name)
    except KeyError:
        logger.exception(
            'Cannot drop privileges: group "{}" does not exist.'.
            format(gid_name))
        sys.exit(1)

    logger.debug('Attempting to drop privileges to "{}:{}"'.
                format(wanted_user.pw_name, wanted_group.gr_name))
    os.setgid(wanted_group.gr_gid)
    os.setuid(wanted_user.pw_uid)
    new_user = pwd.getpwuid(os.getuid())
    new_group = grp.getgrgid(os.getgid())
    logger.info('Privileges dropped, running as "{}:{}"'.
                format(new_user.pw_name, new_group.gr_name))




if __name__ == "__main__":
    config = ConfigParser(os.environ)

    if os.getuid() == 0:
        if not args.force:
            logger.critical("Can't start conpot with root. Please ref user docs for more info.")
            sys.exit(3)
        else:
            logger.warning('Running conpot with root. Running conpot with root isn\'t recommended. ')

    if os.getuid() == 0:
        try:
            # retrieve user to run as
            conpot_user = config.get('daemon', 'user')
        except (NoSectionError, NoOptionError):
            conpot_user = None

        try:
            # retrieve group to run as
            conpot_group = config.get('daemon', 'group')
        except (NoSectionError, NoOptionError):
            conpot_group = None
        # FIXME: drop privs require sudo
        drop_privileges(conpot_user, conpot_group)

 

解释:

1、pwd模块

pwd模块提供了一个unix密码数据库即/etc/passwd的操作接口,这个数据库包含本地机器用户帐户信息

常用操作如下:

pwd.getpwuid(uid):返回对应uid的示例信息

示例:

>>> pwd.getpwuid(0)       
pwd.struct_passwd(pw_name='root', pw_passwd='x', pw_uid=0, pw_gid=0, pw_gecos='root', pw_dir='/root', pw_shell='/bin/bash')

pwd.getpwnam(name):返回对应name的用户信息

示例:

>>> pwd.getpwnam('root')
pwd.struct_passwd(pw_name='root', pw_passwd='x', pw_uid=0, pw_gid=0, pw_gecos='root', pw_dir='/root', pw_shell='/bin/bash')

pwd.getpwall():返回所有的用户信息

示例:

import pwd

def get_user()
    all_user = {}
    for user in pwd.getpwall()
        all_user[user[0]] = all_user[user[2]] = user
    return all_user

def userinfo(uid):
    return get_user()[uid]

执行结果:

print userinfo(0)
pwd.struct_passwd(pw_name='root', pw_passwd='x', pw_uid=0, pw_gid=0, pw_gecos='root', pw_dir='/root', pw_shell='/bin/bash')
print userinfo('root')
pwd.struct_passwd(pw_name='root', pw_passwd='x', pw_uid=0, pw_gid=0, pw_gecos='root', pw_dir='/root', pw_shell='/bin/bash')

2、grp模块

grp模块提供了一个操作unix用户组即/etc/group数据库的接口

常用操作如下:

grp.getgrgid(gid):返回对应gid的组信息

示例:

>>> print grp.getgrgid(0)
grp.struct_group(gr_name='root', gr_passwd='x', gr_gid=0, gr_mem=[])

grp.getgrnam(name):返回对应name的组信息

示例:

>>> print grp.getgrnam('root')
grp.struct_group(gr_name='root', gr_passwd='x', gr_gid=0, gr_mem=[])

grp.getgrall():返回所有的组信息

 

<think>我们正在讨论Linux系统中Python相关的用户权限设置及管理。根据引用内容,我们可以总结以下几点关键信息:1.在Linux系统中,Python脚本的执行权限取决于运行它的用户身份(引用[1])。2.在Ubuntu等系统中,可以使用`sudo`命令让普通用户临时以管理员权限执行命令(引用[2])。3.对于需要管理员权限的操作,可以通过自动交互方式(如expect脚本)或设置sudoers文件来避免直接使用root账户(引用[3])。用户的问题集中在“LinuxPython用户权限设置及管理”,因此我们需要从以下几个方面展开:###1.理解Linux文件权限用户在Linux中,每个文件和进程都有所属用户和组,并设置了相应的读(r)、写(w)、执行(x)权限Python脚本作为一个文件,需要具有可执行权限(通过`chmod+xscript.py`设置),同时运行脚本的用户必须具有该文件的读取权限。###2.以特定用户身份运行Python脚本有时我们需要以另一个用户的身份运行脚本,这可以通过以下方式实现:-使用`su`命令切换用户(需要知道目标用户的密码):```bashsu-target_user-c"pythonscript.py"```-使用`sudo`命令(需要当前用户在sudoers文件中被授权):```bashsudo-utarget_userpythonscript.py```###3.提升Python脚本的权限当脚本需要执行管理员操作时,可以:-使用`sudo`运行整个脚本(需要用户有sudo权限):```bashsudopythonscript.py```-在脚本内部按需提升部分命令的权限(通过调用`sudo`命令):```pythonimportsubprocesssubprocess.call(['sudo','apt','update'])```###4.避免使用root权限为了安全,应尽量减少使用root权限。可以通过以下方式:-将需要特权的操作集中到一个小脚本中,并通过sudoers文件授权特定用户运行该脚本,而无需使用root密码(引用[3]提到的方法)。例如,在`/etc/sudoers`中添加:```usernameALL=(root)NOPASSWD:/path/to/script.py```然后普通用户就可以用`sudo/path/to/script.py`来执行该脚本,且无需输入密码。###5.Python中的权限管理模块Python标准库中的`os`模块可以处理文件权限用户切换等:-获取当前用户:`os.getuid()`,`os.getgid()`-更改文件权限:`os.chmod(path,mode)`-更改文件所有者和组:`os.chown(path,uid,gid)`(需要root权限)###6.安全注意事项-尽量避免在Python脚本中硬编码密码。-使用最小权限原则,即只授予必要的权限。-对于需要密码输入的操作,考虑使用安全的输入方式(如getpass模块)。###示例:以指定用户身份运行Python函数如果需要在Python脚本内部切换用户,可以使用以下方法(需要root权限):```pythonimportosimportpwddefdrop_privileges(username):#获取目标用户的uid和giduser_info=pwd.getpwnam(username)uid=user_info.pw_uidgid=user_info.pw_gid#设置新的gid和uid(注意顺序:先gid后uid)os.setgid(gid)os.setuid(uid)#设置环境变量os.environ['HOME']=user_info.pw_dir#使用示例(需要以root运行)ifos.getuid()==0:drop_privileges('nobody')print(f"当前用户已切换至:{os.getlogin()}")else:print("必须以root运行才能切换用户")```###总结在Linux中管理Python脚本的权限主要涉及:-正确设置文件权限。-使用`sudo`或`su`以特定用户身份运行脚本。-在脚本中按需提升权限或切换用户。-通过sudoers文件进行细粒度权限控制。§§相关问题§§1.如何在Python脚本中安全地处理需要管理员权限的操作?2.如何配置sudoers文件使普通用户无需密码运行特定Python脚本?3.在Linux中,如何让Python脚本在启动时自动以特定用户身份运行?</think>### Linux系统中Python用户权限设置与管理 在Linux系统中管理Python脚本的用户权限涉及以下核心机制: #### 1. **基础权限控制** - **文件权限设置**:使用`chmod`控制脚本执行权限 ```bash chmod u+x script.py # 授予所有者执行权限 chmod 755 script.py # 所有者RWX,其他用户RX ``` - **用户身份验证**:Python脚本自动继承执行用户权限 ```python import os print(f"当前用户UID: {os.getuid()}, GID: {os.getgid()}") # 输出执行者身份 ``` #### 2. **特权操作执行** - **sudo临时提权**:普通用户执行管理员命令 ```bash sudo -u target_user python script.py # 以指定用户身份运行 ``` 需在`/etc/sudoers`配置授权: ``` username ALL=(target_user) NOPASSWD: /path/to/script.py ``` - **Python内部提权**(需谨慎): ```python import os, pwd if os.getuid() == 0: # 确认当前是root target_uid = pwd.getpwnam("app_user").pw_uid os.setuid(target_uid) # 降权到普通用户 ``` #### 3. **安全增强方案** - **Capabilities机制**:赋予特定特权而非完全root ```bash setcap cap_net_raw+ep /path/to/script.py # 授予原始网络访问权 ``` - **系统服务配置**:通过systemd以指定用户运行 ```ini # /etc/systemd/system/pyapp.service [Service] User=app_user ExecStart=/usr/bin/python /opt/app/main.py ``` #### 4. **权限管理最佳实践** 1. **最小权限原则**:脚本仅拥有必要权限 2. **输入验证**:严格过滤外部输入数据 3. **日志审计**:记录关键操作日志 4. **环境隔离**:使用虚拟环境或容器 5. **定期更新**:保持Python和依赖库最新 > **关键区别**: > - `sudo`:临时提权执行命令(需用户授权)[^2] > - `setuid`:二进制文件永久持有特权(慎用于脚本) > - Capabilities:精细化特权管理(推荐方案) #### 5. 典型应用场景 - **Web服务**:以`www-data`用户运行Flask/Django应用 - **系统监控**:普通用户+sudo执行硬件检测脚本 - **自动化任务**:cron定时任务指定运行用户 ```crontab * * * * * app_user python /scripts/backup.py ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨痕诉清风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值