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)