【问题标题】:Running Python script as root (with sudo) - what is the username of the effective user?以 root 身份运行 Python 脚本(使用 sudo) - 有效用户的用户名是什么?
【发布时间】:2011-08-08 22:56:46
【问题描述】:

我最近开始为我的 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
它应该从配置文件中打印example 的值,但是当以sudo 运行时,路径是/home/root,所以它找不到配置文件。

【问题讨论】:

  • 您是否使用os.getuid() 获取真实用户(而不是有效用户)并从中计算出主目录?还是您只是使用os.path.expanduser()
  • 我正在使用os.path.expanduser("~/")。我使用 os.getuid() 因为脚本必须以 root 身份运行。所以它会检查以确保你是 root,如果你不是它,它会吐出一条错误消息并退出。
  • @JMariz:既然扩展用户不起作用,你为什么要使用它?
  • 好吧,假设我是另一台机器上的用户myuser2。我希望它能够在其他人的计算机上运行。所以它需要找到 ~/ 目录。所以它需要能够自动检测用户的主目录。但是作为 sudo 它不能这样做,因为用户已更改为 root。
  • 并非如此。概念是一样的。我只需要找到有效用户的主路径,这就是原始问题所要求的。

标签: python configuration root sudo


【解决方案1】:

如果您使用 sudo (sudo myscript.py) 运行脚本,则环境变量 $USER 将是 root,而环境变量 $SUDO_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):

    root
    bob

如果 bob 在没有 sudo 权限的情况下运行程序

./myscript.py

他会得到以下输出:

    bob
    None

【讨论】:

    【解决方案2】:

    如果您想在启动 sudo 命令之前获取已登录的用户,则将其存储在 SUDO_USER 环境变量中。

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

    您还拥有用户 ID 和组 ID 的 SUDO_UID 和 SUDO_GID。

    【讨论】:

    • macOS:os.path.expanduser('~'+os.getenv("SUDO_USER"))
    • 通常只获得 SUDO_USER 的用户名是不够的,您需要 Mac 和 Linux 上的主目录,正如 @Liviu 上面提到的那样。如果不使用 sudo,您需要用户本身的主目录。解决方案就像这篇文章stackoverflow.com/a/42750492/796858
    【解决方案3】:

    这不起作用。

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

    【讨论】:

    • 应该是'homepath = os.path.expanduser("~")'
    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多