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

时间:2011-04-19 19:21:03

标签: python configuration root sudo

我最近开始在我的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,因此它找不到配置文件。

3 个答案:

答案 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+"/")