我的 CGI Perl 脚本 CentOS 7 无法正确运行,它们要么显示为纯文本,要么出现服务器错误。
我一直将脚本放入默认/var/www/cgi-bin
目录,但没有成功。
我尝试放入 CGI 脚本,/var/www/html/another-dir
但它们只是以纯文本的形式出现。
答案1
这是如何在 CentOS 7 上正确执行 CGI Perl 脚本。
我把它留在这里,因为看起来互联网上的很多资源没有结合这些步骤,让像我这样的人感到非常困惑。
简而言之,这就是需要做的事情。
- 安装软件。
- 创建测试 CGI 文件。
- 确保 CGI 模块已加载。在 里面
httpd.conf
。 - 更改 中的目录设置
httpd.conf
。 - 更改权限以允许 CGI 执行。
安装和配置软件
sudo yum update
sudo yum install httpd
sudo yum install perl perl-CGI
sudo systemctl start httpd.service
sudo systemctl enable httpd.service
创建测试 CGI 文件
即使完全按照这些步骤操作,我还是无法在/var/www/cgi-bin
不修改内部 Web 根目录的情况下加载CGI 脚本httpd.conf
。因此,我决定在另一个目录中激活 CGI。
在我的服务器上,我希望 Web 根目录html
保存我的 CGI 文件。这是/var/www/html/hello.cgi
#!/usr/bin/perl
print "Content-type: text/html\n\n"; # This is mandatory.
print "<h2>Hello world!</h2>";
确保已加载 CGI 模块。内部httpd.conf
您可以通过命令轻松检查这一点。
grep -n "LoadModule" /etc/httpd/conf/httpd.conf
我可以看到没有指定 CGI 模块,并且我通过以下方式确认了它们在模块文件夹中的存在:
find /etc/httpd/modules/ -iname "*cgi*"
这就是我所追求的:
/etc/httpd/modules/mod_cgi.so
我们将其添加到/etc/httpd/conf/httpd.conf
文件中:
LoadModule cgi_module modules/mod_cgi.so
我相信你需要加载在 Ubuntu 中以不同的方式安装模块, 记住这一点。
更改目录设置httpd.conf
重新启动之前httpd
我们必须再改变一件事/etc/httpd/conf/httpd.conf
:
<Directory "var/www/html">
Options +ExecCGI
AddHandler cgi-script .cgi .pl
</Directory>
根据许多谷歌搜索,您可能还必须修改文件的这一部分httpd.conf
,以使其指向与上面相同的目录"var/www/html"
:
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
我没有修改它,似乎没有什么区别。
更改权限以允许 CGI 执行
这一点让我很为难!不要忽视这一点!
您需要告诉你的服务器,这些 CGI 脚本被允许作为程序执行。
chmod 705 *.cgi
或者您可以定位单个 CGI 脚本。
chmod 705 hello.cgi
(有些人互联网已经说过chmod 755
并且777
可能也有效。
现在httpd
像这样重新启动:
sudo systemctl restart httpd.service
此时我的 CGI 脚本已正确呈现为 HTML。
它们正从网络根目录提供服务,如下所示:http://<IP>/hello.cgi
请随意添加任何可能对其他人有帮助的信息。
答案2
(网上有些人说 chmod 755 和 777 也许也有效。)
如果您与其他人共享服务器,并且通常由于可能受到攻击,您几乎肯定不应使用 755、705 或 777 中的任何一个。这些将使登录到您服务器的任何其他用户能够使用他们选择的任何参数执行您的脚本。相反,请确保您的脚本及其上层的所有目录都有 nginx、apache 或任何运行您的 Web 服务器并应该以所有者或组身份执行您的脚本的用户/组(使用命令 chown 或 chgrp)。然后将 chmod 中的第三位设置为 0(您永远不应使用比 750 更宽松的设置),因为您服务器上的其他用户(除了您和 nginx/apache,无论是入侵者还是合法用户)都无权从 shell 执行、读取或修改您的脚本。
您可以在以下网址阅读有关 Linux 文件权限的信息https://www.digitalocean.com/community/tutorials/linux-permissions-basics-and-how-to-use-umask-on-a-vps#octal或者https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-permissionsETC
祝你好运!
编辑:这是对用户 chick 于 1 月 28 日所写内容的解释——很好的解释,教程中的权限太宽松了。
答案3
还有一点需要注意的是,如果你在 Windows 环境中编写代码,然后将其远程上传到服务器,请确保将文件转换为Unix 终止服务(尤其是使用“编辑”菜单下的 Notepad++ 时);否则,您将收到服务器错误。