Python CGIHTTPServer崩溃与“OSError:权限被拒绝”

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

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 

你是否有机会以root身份运行这个进程?

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

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

也就是说,如果它能够改变UID,即它是根,它将以无人的方式运行CGI脚本。 如果它不是root,这个调用很可能会失败,然后传递。

所以我猜测你是以root用户身份运行服务器的,所以脚本是没有人运行的,但是这个用户没有权限访问脚本。 这是预料之中的,正如你所说,它在你的家里。

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

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

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

我遇到了从Ubuntu Linux相同的问题。 跟随“迈克”的解决方案,修改。 取而代之的是对具有多个文件夹的“/ usr”进行chmod更改包含被拒绝的可执行文件的文件夹的权限。 (你可以在同一位置加载一个静态html文件时检查服务器是否运行正常,只有在运行脚本时才显示错误)。

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

现在脚本有权限,所以应该运行良好。 请注意,-R给这个文件夹中的所有文件(和子文件夹,如果有的话)的权限。

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

对于Linux和Windows用户,情况并非如此!

我得到以下错误:

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

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

对于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 cat inputfile | col -b > outputfile (只需重命名输出文件一个新名称 – >擦除旧文件 – >然后将输出文件名改回原来的名称)c)下载dos2unix,然后输入终端命令行:dos2unix输入文件名

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

对于Mac OSX用户来说,它几乎是一样的:

  1. 从Linux重复步骤1)
  2. 从Linux重复步骤2)

对于第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和命令行进行必要的调整。