我想獲得父用戶在Python 一個sudo
命令後例如,從殼我可以這樣做:獲取父用戶使用Python
# Shows root; *undesired* output
$ sudo whoami
root
# Shows parent user sjcipher, desired output
$ sudo who am i
sjcipher
如何做到這一點的沒有使用外部程序的Python?
我想獲得父用戶在Python 一個sudo
命令後例如,從殼我可以這樣做:獲取父用戶使用Python
# Shows root; *undesired* output
$ sudo whoami
root
# Shows parent user sjcipher, desired output
$ sudo who am i
sjcipher
如何做到這一點的沒有使用外部程序的Python?
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']
可以會更好,這取決於你究竟要怎樣做。
啊這是最簡單的os.environ ['SUDO_USER'],這是完全合理的。 –
爲引用before,您可以使用getpass模塊的
>>> import getpass
>>> getpass.getuser()
'kostya'
此操作會在sudo或切換用戶之前給予原始用戶。我想弄清楚第一個用戶。 –
我認爲你必須對此做一個**大膽的**註釋。每個人都給我像這樣的答案:) –
根據不同的設置,你可以使用已設置環境變量。請注意,這可能不適用於所有情況,但可能適用於您的情況。應該在su之前返回原始用戶。
import os
print os.environ["USER"]
SUDO_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_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'
沒有調用外部命令請閱讀我的問題。 –
看到這個答案:http://stackoverflow.com/a/2899055/2073595 – dano
這是不同的,請檢查whoami和誰是我的差異 –