使用Python在sudo之后获取父用户

使用Python在sudo之后获取父用户,python,unix,Python,Unix,我想在Python中执行sudo命令之后获取父用户 例如,从shell中,我可以执行以下操作: # Shows root; *undesired* output $ sudo whoami root # Shows parent user sjcipher, desired output $ sudo who am i sjcipher 如何在不使用外部程序的情况下在Python中执行此操作?如前所述,您可以使用getpass模块 >>> import getpass &g

我想在Python中执行
sudo
命令之后获取父用户 例如,从shell中,我可以执行以下操作:

# Shows root; *undesired* output
$ sudo whoami
root

# Shows parent user sjcipher, desired output
$ sudo who am i
sjcipher
如何在不使用外部程序的情况下在Python中执行此操作?

如前所述,您可以使用getpass模块

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

根据设置,您可以使用已设置的环境变量。请注意,这可能并不适用于所有情况,但可能适用于您的情况。应在su之前返回原始用户

import os
print os.environ["USER"]

我是谁
从谁那里获取信息; 使用Python,您可以使用访问信息

下面是一个例子,改编自
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模块(即,它需要编译),只适用于Python2(而不是3)

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

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

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

因此,使用类似于
os.environ['SUDO\u USER']
的方法可能会更好,这取决于您到底在做什么。

SUDO\u USER环境变量在大多数情况下都应该可用:

import os

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

这是一个单班轮就可以了

user = os.environ['SUDO_USER'] if 'SUDO_USER' in os.environ else os.environ['USER']
无论是
os.getlogin()
还是
os.getenv('SUDO\u 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'

在不调用外部命令的情况下,请阅读我的问题。请查看以下答案:这是不同的,请检查whoami和whoami的区别我是谁在有控制终端的情况下可以工作。这不会在sudo或switch用户之前给出原始用户。我正在试图找出第一个用户。我想你必须对此做一个大胆的说明。每个人都像我一样给出答案:)这将给出当前用户而不是切换用户之前的用户。切换用户后对我来说效果很好。如果我可以问的话,你的目标是什么操作系统?我在RHEL 6.3Odd上运行,我在RHEL 5.5上测试了它,它成功了。哦,看来你还是找到了操作系统模块的答案。如果我使用
sudo-python
并转到interactive shell,它给了我“root”,但我希望看到运行sudo的原始用户。顺便说一句,谢谢你,我学到了一些东西。啊,这是最简单的操作系统。environ['SUDO_USER',],这完全有道理。