Python CGIHTTPServer崩溃与"OSError:[Errno 13] Permission denied"

qwe*_*boy 8 python linux cgi

我从我的主目录运行以下命令:

python -m CGIHTTPServer
Run Code Online (Sandbox Code Playgroud)

这运行服务器,但是当我尝试访问cgi-bin目录中的脚本时,我得到:

Traceback (most recent call last):
  File "/usr/lib/python2.7/CGIHTTPServer.py", line 251, in run_cgi
    os.execve(scriptfile, args, env)
OSError: [Errno 13] Permission denied
Run Code Online (Sandbox Code Playgroud)

以root身份运行并没有什么不同.这些文件似乎具有所有正确的权限:

student@bandersnatch:~$ ls -lhR
.:
total 12K
drwxr-xr-x 2 student student 4.0K Jun 13 18:38 cgi-bin
drwxr--r-- 2 student student 4.0K Jun 10  2004 kalpy
-rwxrwxrwx 1 student student 2.0K Jun 13 12:37 test.html

./cgi-bin:
total 8.0K
-rwxr-xr-x 1 student student 31 Jun 13 18:38 test.py
Run Code Online (Sandbox Code Playgroud)

编辑:test.py的内容是:

#!/usr/bin/python
print "test"
Run Code Online (Sandbox Code Playgroud)

shebang有效:

~$ which python
/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

rod*_*igo 9

您是否有机会以root身份运行该流程?

如果你使用了源代码,你会CGIHTTPServer.py在调用之前看到execve:

try:
    os.setuid(nobody)
except os.error:
    pass
Run Code Online (Sandbox Code Playgroud)

也就是说,如果它能够更改UID,它将以无人的身份运行CGI脚本,即如果它是root用户.如果它不是root,则此调用很可能会失败,并继续传递.

所以我的猜测是你以root身份运行服务器,所以脚本是以nobody身份运行的,但是这个用户无法访问脚本.这是预期的,正如你所说,它在你的家里.

我能想到的两个解决方案:

  • 建议:不要以root身份运行服务器!
  • 解决方法:将脚本复制到没有人可以读取的目录(/tmp例如).