我最近开始在我的python脚本中使用ConfigParser()为配置文件添加一些功能。我知道如何使用它,但我有一个问题。我的脚本需要使用sudo作为root用户运行。配置文件位于~/.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
它应该从配置文件中打印example
的值,但是当以sudo身份运行时,路径为/home/root
,因此它找不到配置文件。
答案 0 :(得分:24)
如果您使用sudo(sudo myscript.py
)运行脚本,则环境变量$USER
将为root
,环境变量$SUDO_USER
将是用户的名称执行了命令sudo myscript.py
。以下只是CédricJulien对上一篇文章的澄清。请考虑以下情形:
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):
root
bob
如果bob运行该程序没有使用
的sudo权限 ./myscript.py
他将获得以下输出:
bob
None
答案 1 :(得分:5)
如果要在启动sudo命令之前获取已登录的用户,则将其存储在SUDO_USER环境变量中。
import os
sudo_username = os.getenv("SUDO_USER")
home_dir = "/home/" + sudo_username
您还拥有用户ID和组ID的SUDO_UID和SUDO_GID。
答案 2 :(得分:4)
这不起作用。
homepath = os.path.expanduser("~/")
所以不要使用它。
你想要这个。
username= os.environ["LOGNAME"]
homepath = os.path.expanduser("~"+username+"/")
http://docs.python.org/library/os.html#os.getlogin
或者也许这个。
username= pwd.getpwuid(os.getuid())[0]
homepath = os.path.expanduser("~"+username+"/")