如何确定Python脚本以哪个用户和组运行?

37 投票
4 回答
37800 浏览
提问于 2025-04-15 23:58

我有一个CGI脚本,在网页服务器的错误日志里出现了一个"IOError: [Errno 13] Permission denied"的错误。

为了调试这个问题,我想在脚本里加一点代码,把脚本运行时的用户和(特别是)组的信息打印到错误日志里(大概是STDERR)。

我知道可以直接把这些值打印到sys.stderr,但是我该怎么知道脚本是以哪个用户和组在运行呢?

(我特别想知道组的信息,所以$USER这个环境变量帮不了我;这个CGI脚本设置了setgid位,所以它应该是以"group list"的身份运行,而不是网页服务器的"www-data"身份——但我需要代码来确认这点。)

4 个回答

1

os.getgid()os.getuid() 这两个函数很有用。想要获取其他环境变量,可以使用 os.getenv。比如,在我的 Mac OS X 上,使用 os.getenv('USER') 可以得到用户名。而在 Windows 电脑上,使用 os.getenv('USERNAME') 也能得到用户名。

62
import os
import getpass
print(getpass.getuser())

考虑一下下面这个脚本。

---- foo.py ----     
import os
import 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

与正在运行进程的有效 ID。

$ sudo -u apache id -u

33

注意:这正是网络服务器在启动时所做的事情。它们创建了一个沙箱(通过分叉/分离伪终端等),并以另一个用户的身份运行。想要深入了解这里发生了什么,可以查看《UNIX环境高级编程》一书中关于“守护进程”的章节。

这是一个关于这个主题的另一个不错的讨论

26

你可以使用下面这段代码:

import os
print(os.getegid())

撰写回答