如何确定Python脚本运行的用户和组?

我有一个CGI脚本,它在Web服务器错误日志中的堆栈跟踪中出现“IOError:[Errno 13] Permission denied”错误。

作为调试此问题的一部分,我想向脚本添加一些代码,以便将脚本正在运行的用户和(尤其是)组打印到错误日志(可能是STDERR)中。

我知道我可以将值打印到sys.stderr,但是如何找出脚本正在运行的用户和组?

(我对这个组特别感兴趣,所以$ USER环境变量不会帮助; CGI脚本的setgid位已设置,因此它应该作为组“list”而不是Web服务器的“www-data”运行 - 但我需要使用代码来查看是否真的发生了。)


import os
print os.getegid()

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正在运行的进程的有效标识。

$ sudo -u apache id -u

33

注意:这正是Web服务器在启动时正在执行的操作。 他们正在创建一个沙箱(通过分叉psudo终端等),并作为另一个用户运行。 有关此处发生的事情的深入说明:请参阅UNIX环境手册中“高级编程”中有关“守护进程”的章节。

关于这个问题的另一个好主意。


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

链接地址: http://www.djcxy.com/p/79433.html

上一篇: How to determine what user and group a Python script is running as?

下一篇: How to Retrieve name of current Windows User (AD or local) using Python?