我有一个CGI脚本,它在Web服务器的错误日志中的堆栈跟踪中出现“IOError:[Errno 13] Permission denied”错误。
作为调试此问题的一部分,我想在脚本中添加一些代码,以便将用户和(特别是)脚本运行的组打印到错误日志中(可能是STDERR)。 / p>
我知道我可以将值打印到sys.stderr,但是如何确定脚本运行的用户和组?
(我对该组特别感兴趣,因此$ USER环境变量无济于事; CGI脚本设置了setgid位,因此它应该作为组“list”而不是Web服务器的“www-”运行数据“ - 但我需要代码来查看是否真的发生了。”
答案 0 :(得分:24)
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终端等), 并作为另一个用户运行。有关此处发生的事情的深入说明:请参阅Advanced Programming in the UNIX environment一书中关于“守护进程”的章节。
Another good thread关于这个主题。
答案 1 :(得分:21)
import os
print os.getegid()
答案 2 :(得分:1)
os.getgid()和os.getuid()可能很有用。对于其他环境变量,请查看os.getenv。例如,我的Mac OS X上的os.getenv('USER')返回用户名。 os.getenv('USERNAME')将在Windows机器上返回用户名。