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
4

4 回答 4

10

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

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

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

也就是说,如果它能够更改 UID,即它是 root,它将以无人身份运行 CGI 脚本。如果它不是 root,这个调用很可能会失败,然后继续。

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

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

  • 建议:不要以root身份运行服务器!
  • 解决方法:将脚本复制到没有人可以读取它的目录(/tmp例如)。
于 2012-06-13T21:55:00.363 回答
1

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

于 2012-06-13T19:46:46.050 回答
1

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

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

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

于 2016-09-04T14:15:21.543 回答
0

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

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

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

于 2015-03-18T01:00:06.667 回答