使用Python在sudo后获取父用户

5
我想在Python中获得sudo命令后的父用户。例如,从shell中可以执行以下操作:
# Shows root; *undesired* output
$ sudo whoami
root

# Shows parent user sjcipher, desired output
$ sudo who am i
sjcipher

如何在Python中完成此操作而不使用外部程序?


1
请阅读我的问题,不要调用外部命令。 - James Sapam
把以下与编程有关的内容从英语翻译为中文。只返回已翻译的文本:不同,请检查上面的输出。 - James Sapam
@JoranBeasley 这只是 who -m 的等效命令: "如果给定 ARG1 ARG2,则假定为 -m: 'am i' 或 'mom likes' 是通常的。" - dano
2
如果有控制终端,os.getlogin() 将会起作用。 - dano
为什么这个问题是重复的? - James Sapam
显示剩余9条评论
6个回答

8

SUDO_USER 环境变量在大多数情况下都应该是可用的:

import os

if os.environ.has_key('SUDO_USER'):
    print os.environ['SUDO_USER']
else:
    print os.environ['USER']

3

who am iutmp(5)获取信息; 使用Python,您可以通过pyutmp访问这些信息;

以下是从pyutmp主页改编的示例:

#!/usr/bin/env python2

from pyutmp import UtmpFile
import time, os

mytty = os.ttyname(os.open("/dev/stdin", os.O_RDONLY))

for utmp in UtmpFile():
    if utmp.ut_user_process and utmp.ut_line == mytty:
        print '%s logged in at %s on tty %s' % (utmp.ut_user, time.ctime(utmp.ut_time), utmp.ut_line)


$ ./test.py
martin logged in at Tue Jul  1 21:38:35 2014 on tty /dev/pts/5

$ sudo ./test.py
martin logged in at Tue Jul  1 21:38:35 2014 on tty /dev/pts/5

缺点:这是一个C模块(即需要编译),并且只能在Python 2中使用,无法在Python 3中使用。

也许更好的选择是使用sudo提供的环境变量?例如:

[~]% sudo env | grep 1001
SUDO_UID=1001
SUDO_GID=1001

[~]% sudo env | grep martin
SUDO_USER=martin

因此,使用类似于os.environ ['SUDO_USER'] 这样的内容可能会更好,具体取决于您所要做的事情。


啊,这是最简单的os.environ['SUDO_USER'],这完全有意义。 - James Sapam

0

根据设置,您可以使用已设置的环境变量。请注意,这种方法可能并非在所有情况下都有效,但在您的情况下可能有效。应该返回 su 前的原始用户。

import os
print os.environ["USER"]

这将返回当前用户而不是切换用户之前的用户。 - James Sapam
在我切换用户后,它对我来说运行得很好。如果可以问一下,您的目标操作系统是什么? - Bob
我正在运行于RHEL 6.3操作系统。 - James Sapam
奇怪,我在 RHEL 5.5 上测试过了,而且它有效。不过,似乎你已经找到了使用 os 模块的答案。 - Bob
如果我执行 sudo python 并进入交互式 shell,它会给我返回 'root',但我期望看到运行 sudo 的原始用户。顺便说一下,谢谢,我学到了东西。 - James Sapam
这就是为什么我要su到root然后运行Python的原因。解释了一切。 - Bob

0
这是一个可以完成此任务的一行代码。
user = os.environ['SUDO_USER'] if 'SUDO_USER' in os.environ else os.environ['USER']

0

要么使用os.getlogin(),要么使用os.getenv('SUDO_USER'),看起来都是不错的选择。

[vagrant@localhost ~]$ sudo python3.6
Python 3.6.3 (default, Oct 11 2017, 18:17:37)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getlogin()
'vagrant'
>>> os.getenv('SUDO_USER')
'vagrant'
>>> os.getenv('USER')
'root'
>>> import getpass
>>> getpass.getuser()
'root'

-1

before所述,您可以使用getpass模块

>>> import getpass
>>> getpass.getuser()
'kostya'

1
这并不会给出sudo或切换用户之前的原始用户。我正在尝试找出第一个用户。 - James Sapam
我认为你需要用粗体字重点提醒一下。每个人都会像我一样回答 :) - Mirat Can Bayrak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接