如何确定Python脚本以哪个用户和组运行?
我有一个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())