我的服务器中有 2 个 python 环境。一个路径是 /usr/bin
,另一个路径是 anaconda 路径,如下所示。当我尝试在 Apache 服务器上执行基本 Python 脚本时,出现“权限被拒绝”错误。我的.py文件中的python解释器路径如下
#!/home/cloudera/anaconda3/bin
当使用此路径时,apache服务器会显示如下错误:
(13)Permission denied: exec of '/var/www/cgi-bin/abc.py' failed, referer:
当我的 .py 中的 python 解释器路径更改为 #!/usr/bin
时,它运行良好。
问题是我已将所有软件包安装在 /home/cloudera/anaconda3/bin
我尝试通过在/etc/httpd/conf/httpd.conf 文件中添加以下代码行来设置此路径可在 apache 服务器中执行,如下所示
<Directory "/home/cloudera/anaconda3/bin/">
AllowOverride None
Options ExecCGI
AddHandler cgi-script .py
#None
Order allow,deny
Allow from all
</Directory>
我的权限仍然被拒绝。它仍然不起作用。我是 cgi 新手,任何帮助将非常感激。提前致谢。
最佳答案
诚然,我完全忽略了这样一个事实:解释被指定为目录和实际的二进制文件,如 Jean-François Fabre 所指出的那样。 。这确实会导致同样的错误。但由于OP修复了这个问题并且仍然遇到相同的错误,我将取消删除按要求扩展的答案。
再想想,可能更像是一个Server Fault问题就如它所出现的那样。
<小时/>此错误 (13: EACCES
) 由操作系统引发并传播。
HTTPd 服务器通常采用权限分离,一旦绑定(bind)到保留端口,就会将其 EUID 丢弃给非特权用户。通常由一个人或任何人(在我的系统上是用户 apache
,组 apache
)。您应该能够在 User
和 Group
下的 httpd.conf
中找到这些内容。
确保该用户有权访问并且可以执行您正在调用的二进制文件。
<小时/>假设您已经修复了解释(并且文件将自行执行)。找到您的 httpd.conf
文件(我认为不同的发行版可能会以不同的方式打包它,在我的版本中,它会驻留在此处:/etc/httpd/httpd.conf
)。你会发现User
和 Group
那里的条目。您必须能够以该用户的身份访问和执行脚本(包括解释器),因为这就是 Apache 尝试调用它的方式。 IE。该用户(或组)必须能够访问该文件(沿着完整路径)并执行它。例如,如果 /home/cloudera/
我们限制为 (0700: rwx------
) 并由其他用户拥有,则您的 中列出的用户httpd.conf
(很可能),操作系统会阻止您的 Apache 用户访问和执行该文件,从而导致您看到的 EACCES
错误。最简单的方法可能是成为该用户并查看您的访问权限有多远,但是您需要为此临时调整一些位,因为 Apache 帐户可能已锁定且未设置 shell(或者更确切地说 /bin/false
作为外壳)。
还有一件事,但我希望它没有那么明显。相应的用户必须具有脚本本身的执行权限。
关于Apache 服务器中的 Python exec() 权限被拒绝 :/cgi_bin/*. py,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51410089/