如何在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
相关产品推荐
相关产品推荐

