Python CGIHTTPServer因“OSError:[Errno 13]权限被拒绝”而崩溃。

8
我正在我的主目录下运行以下命令:
python -m CGIHTTPServer

这个命令运行了服务器,但是当我尝试访问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

以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

编辑:test.py的内容如下:

#!/usr/bin/python
print "test"

这个shebang是有效的:

~$ which python
/usr/bin/python

1
test.py中看到_shebang_行会很有用。如果定义的解释器不是有效的可执行文件,可能会出现该错误。 - rodrigo
谢谢@rodrigo,我编辑了我的问题以包含这些信息。 - qwertyboy
4个回答

10

您是否正在以root身份运行该进程?

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

try:
    os.setuid(nobody)
except os.error:
    pass

也就是说,如果能够更改UID(用户标识符),CGI脚本将以nobody身份运行。如果它不是root,则此调用很可能会失败并继续进行。

所以我猜测您正在以root身份运行服务器,因此脚本以nobody身份运行,但该用户无权访问该脚本。这是可以预料的,因为您说它在您的主目录中。

我可以想到两个解决方案:

  • 推荐方法:不要以root身份运行服务器!
  • 解决方法:将脚本复制到nobody可以读取的目录中(例如/tmp)。

1
个人而言,除非有我不知道的原因,否则我建议使用subprocess.Popen而不是os.execve。我曾经遇到过Errno 13的问题,尝试使用Popen(['open execName.app'])启动一个.app文件。我不得不改用Popen(['execName.app/Contents/MacOS/execName','arg1','arg2' ...])代替。不知道这是否有帮助,但可以试试。

我不确定我理解你的意思,@DaveTheScientist,你是在建议我修补CGIHTTPServer吗? - qwertyboy

1
我在Ubuntu Linux上遇到了同样的问题。按照“Mike”的解决方案进行修改。不要对具有多个文件夹的“/usr”进行chmod,而是更改包含被拒绝的可执行文件的文件夹的权限。(您可以检查当在相同位置加载静态HTML文件时服务器是否正常运行,并且仅在运行脚本时显示错误)。
cd /pathto/folder/with/deniedscript
sudo chmod -R 755 ./

现在脚本已经有了权限,所以应该可以正常运行。请注意,-R会给这个文件夹中的所有文件(如果有的话)赋予权限。

0

在Windows上运行时,文件可以直接从命令提示符中运行。

但对于Linux和Windows用户来说情况并非如此!

我遇到了以下错误:

Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/server.py", line 1158, in run_cgi os.execve(scriptfile, args, env) PermissionError: [Errno 13] Permission denied:

您需要执行以下操作以解决这些问题:

对于Linux用户:

1)确保shebang已调整为在Linux和Mac OSX系统上运行的Python 3:

#!/usr/bin/env python3

2) 由于原始可执行文件是在Windows上编写的,因此文件中会有隐藏的'\r',必须将其删除。以下是三种可能的方法: a) 在终端命令行中输入:tr -d ‘\r’ < input file name > output file name(只需将输出文件重命名为新名称-->删除旧文件-->然后将输出文件名重新更改为原始名称) b) 在终端命令行中输入:cat inputfile | col -b > outputfile(只需将输出文件重命名为新名称-->删除旧文件-->然后将输出文件名重新更改为原始名称) c) 下载dos2unix,然后在终端命令行中输入:dos2unix input file name

3) 使文件可执行: 在终端命令行中输入: a) chmod 755 filename 或者 b) chmod +x filename 或者 chmod a+x filename

对于Mac OSX用户,几乎相同:

  1. 重复Linux中的步骤1)
  2. 重复Linux中的步骤2)

对于步骤3,事情会有所改变:

基于 apache.org 的维基页面:https://wiki.apache.org/httpd/13PermissionDenied 它说你必须将文件位置遍历到 /Users 根目录下,使每个可执行文件都执行。
你需要按照以下步骤操作:
3) 在终端命令行中:
a) type command: `cd /Users`
b) type command: `sudo chmod -R 755`

现在你可以通过以下方式运行你的服务器.py文件:

sudo webserver.py

通过常规方式返回输入文件:

python3 inputfile.py

现在你应该可以顺利运行,不再出现权限错误了!如果使用 Python 2,请对 shebang 和命令行进行必要的调整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接