簡體   English   中英

使用Python在sudo之后獲取父用戶

[英]Get parent user after sudo with Python

我希望在Python中使用sudo命令后獲取用戶。例如,從shell我可以做到:

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

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

如何在不使用外部程序的情況下在Python中執行此操作?

在大多數情況下,應該提供SUDO_USER環境變量:

import os

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

who am iutmp(5)獲得了它的信息utmp(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(而不是3)。

也許更好的選擇是使用sudo提供的環境變量? 例如:

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

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

所以使用像os.environ['SUDO_USER']這樣的東西可能會更好,這取決於你正在嘗試做什么。

根據設置,您可以使用已設置的環境變量。 請注意,這可能不適用於所有情況,但可能在您的情況下。 應該在su之前返回原始用戶。

import os
print os.environ["USER"]

這是一個可以做到的單線程。

user = os.environ['SUDO_USER'] if 'SUDO_USER' in os.environ else os.environ['USER']

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'

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM