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

时间:2012-06-13 18:45:56

标签: python linux cgi

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

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

4 个答案:

答案 0 :(得分:9)

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

如果使用来源,您会在致电CGIHTTPServer.py之前在execve中看到:

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

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

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

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

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

答案 1 :(得分:1)

就个人而言,除非有一些我不知道的原因,否则我建议使用subprocess.Popen而不是os.execve。我之前遇到过Errno 13,试图用Popen启动一个.app(['open execName.app'])。我不得不使用Popen(['execName.app/Contents/MacOS/execName','arg1','arg2'...])代替。不知道这是否有帮助,但要试一试。

答案 2 :(得分:1)

我从ubuntu Linux遇到了同样的问题。 遵循" Mike"的解决方案,并进行了修改。 而是做" / usr"的chmod。它有几个文件夹,更改包含被拒绝的可执行文件的文件夹的权限。 (您可以检查在同一位置加载静态html文件时服务器是否正常运行,并且仅在运行脚本时显示错误。)

cd /pathto/folder/with/deniedscript
sudo chmod -R 755 ./

现在脚本有权限,所以应该运行正常。 请注意,-R为该文件夹中的所有文件(以及子文件夹,如果有)提供权限。

答案 3 :(得分:0)

在Windows上运行时,文件会立即运行命令提示符。

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

我收到以下错误:

Traceback(最近一次调用最后一次):文件“/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/http/server.py”,第1158行,在run_cgi os.execve(scriptfile, args,env)PermissionError:[Errno 13]权限被拒绝:

您需要以下内容来解决这些问题:

对于Linux用户:

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

#!/usr/bin/env python3

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

3)使文件可执行: 在终端命令行类型中:     a)chmod 755文件名     要么     b)chmod + x文件名     要么     chmod a + x filename

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

  1. 从Linux重复步骤1)
  2. 从Linux重复步骤2)
  3. 对于第3步,事情发生了变化:

    基于apache.org wiki页面: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和命令行进行必要的调整。