以root用户身份运行Python脚本(使用sudo)-有效用户的用户名是什么?
我最近开始在python脚本中使用ConfigParser()为配置文件添加一些功能。我知道如何使用它,但我有一个问题。我的脚本需要以root用户身份运行,使用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
~/.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