簡體   English   中英

如何確定 Python 腳本運行的用戶和組?

[英]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.

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