【问题标题】:Get username of current session获取当前会话的用户名
【发布时间】:2021-05-19 08:09:14
【问题描述】:

我正在用 python 编写一个程序,它以 root 身份运行(使用 sudo),我试图获取运行它的会话的用户名。 我尝试将os.getuid()pwd 模块结合使用,但它返回root。 我想过获取祖父进程的uid(程序-> sudo-> 具有正确uid的程序),但是我认为这不是一个优雅的解决方案,并且并非在所有情况下都有效。 如何获取当前会话的用户名(或uid)?

PS:我不是英文,所以我的信息可能有一些错误

【问题讨论】:

  • 取决于你如何获得 root。最好的机会可能是SUDO_* 环境变量。
  • 这可能会有所帮助:stackoverflow.com/questions/1629605/…
  • 尝试:'loginctl list-sessions'
  • ok logname 似乎是最好的解决方案,我会使用它

标签: python python-3.x linux


【解决方案1】:

在 UNIX 操作系统上执行此操作的最简单方法是使用“SUDO_USER”环境变量:

>>> import os
>>> os.getenv("SUDO_USER")
'test_user'

唯一需要注意的是,这并不是真正可移植的,例如在 Fedora 17 上,此变量未设置(但几乎适用于所有环境和发行版)。


还有一个更庞大的替代解决方案,涵盖更多的边缘情况,this might work better for your use case.

import os
import shutil
import getpass
import pwd

def get_user():
    """Try to find the user who called sudo/pkexec."""
    try:
        return os.getlogin()
    except OSError:
        # failed in some ubuntu installations and in systemd services
        pass

    try:
        user = os.environ['USER']
    except KeyError:
        # possibly a systemd service. no sudo was used
        return getpass.getuser()

    if user == 'root':
        try:
            return os.environ['SUDO_USER']
        except KeyError:
            # no sudo was used
            pass

        try:
            pkexec_uid = int(os.environ['PKEXEC_UID'])
            return pwd.getpwuid(pkexec_uid).pw_name
        except KeyError:
            # no pkexec was used
            pass

    return user

工作案例EG:

$ python3 getuser.py
test_user
$ sudo python3 getuser.py
test_user
$ pkexec python3 getuser.py
test_user

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多