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

8xiog9wr  于 10个月前  发布在  Unix
关注(0)|答案(3)|浏览(75)

我有一个CGI脚本,它在Web服务器的错误日志中的堆栈跟踪中得到一个"IOError: [Errno 13] Permission denied"错误。
作为调试这个问题的一部分,我想在脚本中添加一点代码,将脚本运行时的用户和(特别是)组打印到错误日志(大概是STDERR)中。
我知道我可以将值打印到sys.stderr,但是我如何确定脚本是以哪个用户和组的身份运行的呢?
(我对这个组特别感兴趣,所以$USER环境变量没有帮助; CGI脚本设置了setgid位,因此它应该作为组“list”而不是Web服务器的“www-data”运行-但我需要代码来查看是否实际发生了这种情况。)

vsdwdz23

vsdwdz231#

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]


正如你所看到的,你这2个调用os.getlogin()getpass.getuser()不是一回事。基本的原则是linux/和其他unix如何管理运行中的用户。
考量

$ id -u


1000
与正在运行的进程的有效ID进行比较。

$ sudo -u apache id -u


33
注意:这正是web服务器在启动时所做的。他们正在创建一个沙盒(通过分叉/分离psudo终端等),并作为另一个用户运行。要深入了解这里发生的事情,请访问:请参阅《Advanced Programming in the UNIX environment》一书中有关“后台进程”的章节。
Another good thread的主题。

4bbkushb

4bbkushb2#

你可以使用下面的代码:

import os
print(os.getegid())

字符串

46qrfjad

46qrfjad3#

os.getgid()os.getuid()可以是有用的。对于其他环境变量,请查看os.getenv。例如,我的Mac OS X上的os.getenv('USER')会传回使用者名称。os.getenv('USERNAME')将返回Windows计算机上的用户名。

相关问题