以root用户身份运行Python脚本(使用sudo)-有效用户的用户名是什么?

以root用户身份运行Python脚本(使用sudo)-有效用户的用户名是什么?,python,configuration,root,sudo,Python,Configuration,Root,Sudo,我最近开始在python脚本中使用ConfigParser()为配置文件添加一些功能。我知道如何使用它,但我有一个问题。我的脚本需要以root用户身份运行,使用sudo。配置文件位于~/.config/scriptconfig/中,但当您以sudo方式运行脚本时,它会临时将用户更改为root用户,因此找不到配置文件。我想做的是获取有效的用户的配置文件,以便它获取/home/myuser/.config/scriptconfig/config.cfg,而不是不存在的/root/.config/sc

我最近开始在python脚本中使用ConfigParser()为配置文件添加一些功能。我知道如何使用它,但我有一个问题。我的脚本需要以root用户身份运行,使用sudo。配置文件位于
~/.config/scriptconfig/
中,但当您以sudo方式运行脚本时,它会临时将用户更改为root用户,因此找不到配置文件。我想做的是获取有效的用户的配置文件,以便它获取
/home/myuser/.config/scriptconfig/config.cfg
,而不是不存在的
/root/.config/scriptconfig/config.cfg

我需要脚本能够在不同的机器上运行,而不仅仅是我的。所以我需要得到有效用户的主目录

下面是我尝试使用的代码示例:

import os, ConfigParser
config = ConfigParser.RawConfigParser()
homepath = os.path.expanduser("~/")
configpath = homepath + ".config/scriptconfig/config.cfg"
config.read(configpath)
get = config.get('Config', 'Example')
print get

导入操作系统,配置解析器
config=ConfigParser.RawConfigParser()
homepath=os.path.expanduser(“~/”)
configpath=homepath+“.config/scriptconfig/config.cfg”
config.read(配置路径)
get=config.get('config','Example')
打印获取
它应该从配置文件中打印
example
的值,但是当作为sudo运行时,路径是
/home/root
,因此它找不到配置文件。

这不起作用

homepath = os.path.expanduser("~/")
所以不要使用它

你想要这个

username= os.environ["LOGNAME"]
homepath = os.path.expanduser("~"+username+"/")

或者是这个

 username= pwd.getpwuid(os.getuid())[0]
 homepath = os.path.expanduser("~"+username+"/")

如果要获取在启动sudo命令之前登录的用户,它将存储在sudo_用户环境变量中

import os
sudo_username = os.getenv("SUDO_USER")
home_dir = "/home/" + sudo_username

用户id和组id也有SUDO UID和SUDO GID。

如果使用SUDO(
SUDO myscript.py
)运行脚本然后环境变量
$USER
将是
root
,环境变量
$SUDO\u USER
将是执行命令的用户的名称
SUDO myscript.py
。以下仅是对塞德里克·朱利安(Cédric Julien)上一篇文章的澄清。考虑下面的场景:

linux用户bob
登录到系统并拥有sudo权限。他编写了以下名为
myscript.py
的python脚本:

    #!/usr/bin/python
    import os
    print os.getenv("USER")
    print os.getenv("SUDO_USER")
然后,他使用
chmod+x myscript.py
使脚本可执行,然后使用以下命令以sudo权限执行脚本:

sudo./myscript.py

该程序的输出将是(使用python 2.x.x):

如果bob以无sudo权限运行程序

/myscript.py

他将获得以下输出:

    bob
    None

您是否使用
os.getuid()
获取真实用户(而不是有效用户)并从中计算出主目录?或者您只是在使用
os.path.expanduser()
?我在使用
os.path.expanduser(“~/”
)。我使用
os.getuid()
,因为脚本必须以root用户身份运行。因此,它会检查以确保您是root用户,如果您不是root用户,它会抛出一条错误消息并退出。@JMariz:既然expand user不起作用,为什么要使用它?假设我是另一台机器上的用户
myuser2
。我希望它能够在其他人的计算机上运行。所以它需要找到~/目录。所以它需要能够自动检测用户的主目录。但作为sudo,它不能这样做,因为用户已更改为root用户。概念是一样的。我只需要找到有效用户的主路径,这就是原始问题所问的。macOS:
os.path.expanduser('~'+os.getenv(“SUDO_user”))
应该是'homepath=os.path.expanduser(“~”)
    bob
    None