我从我的主目录运行以下命令:
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
答案 0 :(得分:9)
您是否有机会以root身份运行该流程?
如果使用来源,您会在致电CGIHTTPServer.py
之前在execve
中看到:
try:
os.setuid(nobody)
except os.error:
pass
也就是说,如果它能够更改UID,它将以无人的身份运行CGI脚本,即如果它是root用户。如果它不是root,则此调用很可能会失败,并继续传递。
所以我的猜测是你以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用户,它几乎相同:
对于第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和命令行进行必要的调整。