You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中从root环境获取普通用户名?

在Root环境下获取原普通用户名的两种场景解决方案

嘿,这个问题我刚好碰到过几次,给你梳理两种场景下的解决办法:

一、从Root身份直接获取普通用户名

这里分两种情况:

  • 情况1:你是通过sudo切换到Root的(比如sudo -i或sudo su)
    这种情况下,系统会保留原用户的信息在环境变量里,直接读取SUDO_USER就行:
    import os
    original_user = os.environ.get('SUDO_USER')
    # 如果返回值不为None,就是你切换前的普通用户名;如果是None,说明你是直接登录的Root
    
  • 情况2:你是直接登录Root,想找出系统里的普通用户
    大部分Linux系统中,普通用户的UID范围在1000到60000之间,我们可以遍历/etc/passwd来筛选:
    import pwd
    # 筛选出所有普通用户名
    normal_users = [user.pw_name for user in pwd.getpwall() if 1000 <= user.pw_uid < 60000]
    

二、执行sudo su后进入Python,getpass.getuser()返回Root时如何获取原用户

当你执行sudo su后,环境变量会被重置,SUDO_USER大概率已经不存在了,这时候可以用/proc文件系统的特性来解决:
Linux的/proc/self/loginuid文件会记录最初登录系统的用户UID,不管你切换多少次用户都不会改变。我们可以读取这个UID,再转换为用户名:

import pwd

def get_original_login_user():
    try:
        # 读取登录UID
        with open('/proc/self/loginuid', 'r') as loginuid_file:
            login_uid = int(loginuid_file.read().strip())
        # 通过UID获取用户名
        return pwd.getpwuid(login_uid).pw_name
    except (FileNotFoundError, ValueError, KeyError):
        # 如果出现异常(比如非Linux系统), fallback到当前用户
        import getpass
        return getpass.getuser()

# 调用函数获取原用户名
print(get_original_login_user())

另外提一句:如果你直接用sudo python3启动交互环境,而不是先sudo su再进Python,那直接用os.environ.get('SUDO_USER')就可以拿到原用户,因为sudo会保留这个环境变量。

内容的提问来源于stack exchange,提问作者sakthivel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:17:37