2014-07-01 14 views
4
須藤後

我想獲得用戶在Python 一個sudo命令後例如,從殼我可以這樣做:獲取父用戶使用Python

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

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

如何做到這一點的沒有使用外部程序的Python?

+1

沒有調用外部命令請閱讀我的問題。 –

+0

看到這個答案:http://stackoverflow.com/a/2899055/2073595 – dano

+0

這是不同的,請檢查whoami和誰是我的差異 –

回答

2

who am i得到它的從utmp(5)信息;你可以通過pyutmp訪問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模塊,並且僅與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']可以會更好,這取決於你究竟要怎樣做。

+0

啊這是最簡單的os.environ ['SUDO_USER'],這是完全合理的。 –

1

爲引用before,您可以使用getpass模塊的

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

此操作會在sudo或切換用戶之前給予原始用戶。我想弄清楚第一個用戶。 –

+0

我認爲你必須對此做一個**大膽的**註釋。每個人都給我像這樣的答案:) –

0

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

import os 
print os.environ["USER"] 
+0

這將給當前用戶不是切換用戶之前的用戶。 –

+0

切換用戶後適合我。如果我想問什麼操作系統? – Bob

+0

我運行在RHEL 6.3 –

6

SUDO_USER環境變量在大多數情況下是可用:

import os 

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

這裏是一個一行,將做到這一點。

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

os.getlogin()os.getenv('SUDO_USER')看起來不錯的選擇。

[[email protected] ~]$ 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'