Python CGIHTTPServer崩溃,出现“OSError:[Errno 13]权限被拒绝”

2024-04-20 10:29:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

以根用户身份运行没有区别。这些文件似乎拥有所有正确的权限:

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

Tags: pytest命令服务器目录binusrstudent
3条回答

您是否以根用户身份运行进程?

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

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

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

所以我猜您是以根用户的身份运行服务器,所以脚本是以nobody的身份运行的,但是这个用户没有访问脚本的权限。这是意料之中的,就像你说的,它在你的主目录中。

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

  • 建议:不要以根用户身份运行服务器!
  • 解决方法:将脚本复制到一个目录,在这个目录中,没有人可以读取它(例如/tmp)。

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

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

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

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

相关问题 更多 >