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

Chi*_*ael 21 python unix permissions

我有一个CGI脚本,在Web服务器的错误日志中的堆栈跟踪中收到"IOError:[Errno 13] Permission denied"错误.

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

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

(我对该组特别感兴趣,因此$ USER环境变量无济于事; CGI脚本设置了setgid位,因此它应该作为组"list"而不是Web服务器的"www-data"运行 - 但我需要代码来查看是否真的发生了.)

Jef*_*eld 29

import os, getpass
print getpass.getuser()
Run Code Online (Sandbox Code Playgroud)

请考虑以下脚本.

---- foo.py ---- 
import os, getpass
print "Env thinks the user is [%s]" % (os.getlogin());
print "Effective user is [%s]" % (getpass.getuser());
Run Code Online (Sandbox Code Playgroud)

考虑运行脚本.

$ python ./foo.py
Run Code Online (Sandbox Code Playgroud)

结果是

Env thinks the user is [jds]
Effective user is [jds]
Run Code Online (Sandbox Code Playgroud)

现在运行

$ sudo -u apache python ./foo.py
Run Code Online (Sandbox Code Playgroud)

结果是

Env thinks the user is [jds]
Effective user is [apache]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,你这2个电话os.getlogin()getpass.getuser()不一样的东西.基本原则是linux /和其他unix如何管理正在运行的用户.

考虑

$ id -u
Run Code Online (Sandbox Code Playgroud)

1000

vs正在运行的进程的有效ID.

$ sudo -u apache id -u
Run Code Online (Sandbox Code Playgroud)

33

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

关于这个问题的另一个好主题.


Pet*_*ons 22

import os
print os.getegid()
Run Code Online (Sandbox Code Playgroud)

  • `os.geteuid()` 返回有效的 *user* id (2认同)