繁体   English   中英

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

[英]Python CGIHTTPServer crashes with “OSError: [Errno 13] Permission denied”

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

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身份运行服务器,所以脚本是以nobody身份运行的,但是这个用户没有访问脚本的权限。 这是预期的,正如你所说,它在你的家里。

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

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

就个人而言,除非有一些我不知道的原因,我建议使用subprocess.Popen而不是os.execve。 我之前遇到过Errno 13,试图用Popen启动一个.app(['open execName.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用户来说并非如此!

我收到以下错误:

回溯(最近一次调用最后一次):文件“/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 (只需将输出文件重命名为新名称 - >擦除旧文件 - >然后重新输出输出filename返回原文)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和命令行进行必要的调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM