如何确定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?