如何确定Python脚本正在以哪个用户和组的身份运行?

37

我有一个CGI脚本,在Web服务器的错误日志中的堆栈跟踪中遇到了"IOError: [Errno 13] Permission denied"错误。

为了调试这个问题,我想在脚本中添加一些代码,将脚本运行的用户和(尤其是)组打印到错误日志中(可能是STDERR)。

我知道可以将这些值打印到sys.stderr,但是如何确定脚本正在以哪个用户和组的身份运行呢?

(我特别关注组,因此$USER环境变量无法帮助;CGI脚本已设置setgid位,因此应该作为组"list"而不是web服务器的"www-data"运行-但我需要判断是否实际上发生了这种情况。)

3个回答

61
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

注意:这正是Web服务器在启动时所做的事情。它们通过创建一个沙盒(通过分叉/脱离伪终端等)并以另一个用户身份运行来实现。关于这里正在发生的详细情况,请参阅《UNIX环境高级编程》一书中关于“守护进程”的章节。
关于这个主题,还有另一个很好的讨论线程

26

你可以使用以下代码:

import os
print(os.getegid())

1
这会返回,但不是用户,对吗?从文档中可以看到:[这将返回]当前进程的有效组ID。这对应于在当前进程中执行的文件上的“设置ID”位。 - alex
是的,这是组的ID而不是用户的ID。 - Peter Lyons
3
os.geteuid() 返回有效的用户 ID。 - Benjamin

1

os.getgid()os.getuid()可能很有用。对于其他环境变量,请查看os.getenv。例如,在我的Mac OS X上,os.getenv('USER')返回用户名。在Windows机器上,os.getenv('USERNAME')将返回用户名。


2
你也可以看一下 getpass.getuser()。 - ʇsәɹoɈ
1
我同意,getpass.getuser() 获取登录名,这通常是您要查找的内容! - Vladtn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接