[英]How to determine what user and group a Python script is running as?
我有一個 CGI 腳本,它在 Web 服務器錯誤日志的堆棧跟蹤中收到"IOError: [Errno 13] Permission denied"
錯誤。
作為調試此問題的一部分,我想在腳本中添加一些代碼,以將運行腳本的用戶和(特別是)組打印到錯誤日志(大概是 STDERR)中。
我知道我可以將值打印到sys.stderr
,但是我如何確定腳本運行的用戶和組?
(我對組特別感興趣,所以$USER
環境變量無濟於事;CGI 腳本設置了 setgid 位,因此它應該作為組“列表”而不是網絡服務器的“www-data”運行 -但我需要代碼來看看這是否真的發生了。)
import os, getpass
print getpass.getuser()
考慮以下腳本。
---- foo.py ----
import os, getpass
print "Env thinks the user is [%s]" % (os.getlogin());
print "Effective user is [%s]" % (getpass.getuser());
考慮運行腳本。
$ python ./foo.py
結果是
Env thinks the user is [jds]
Effective user is [jds]
現在運行
$ sudo -u apache python ./foo.py
結果是
Env thinks the user is [jds]
Effective user is [apache]
如您所見,這兩個調用os.getlogin()
和getpass.getuser()
不是一回事。 基本原理是 linux/和其他 unix 如何管理正在運行的用戶。
考慮
$ id -u
1000
vs 正在運行的進程的有效 id。
$ sudo -u apache id -u
33
注意:這正是 Web 服務器在啟動時所做的事情。 他們正在創建一個沙箱(通過分叉/分離 psudo 終端等),並以另一個用戶身份運行。 要深入了解這里發生的事情:請參閱UNIX 環境中的高級編程一書中關於“守護進程”的章節。
關於這個主題的另一個好話題。
您可以使用以下代碼:
import os
print(os.getegid())
os.getgid()
和os.getuid()
很有用。 對於其他環境變量,請查看os.getenv
。 例如,我的 Mac OS X 上的os.getenv('USER')
返回用戶名。 os.getenv('USERNAME')
將返回 Windows 機器上的用戶名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.