Apache 未在包含的 perl 脚本中执行“do”包含函数

Posted

技术标签:

【中文标题】Apache 未在包含的 perl 脚本中执行“do”包含函数【英文标题】:Apache not executing a 'do' include function in included perl script 【发布时间】:2021-05-06 04:30:14 【问题描述】:

Apache 2.4 已针对服务器端包含进行了配置,并且只要变量是本地的,就可以正确运行任何传递的 CGI 脚本。但是,我们有一些脚本使用“do”函数从配置文件中提取变量,如下所示:

#!/usr/bin/perl
do '../includes/cgi.conf';
print "Content-type: text/html\n\n";
print $hostname

cgi.conf 包含以下内容:

$host = 'none.nowhere.com';

当在网络服务器上的命令行执行时,变量会按预期填充到输出中。但是,除非在脚本中本地声明变量,否则 Apache 不会按预期打印它。

我正在将应用程序从 RHEL6/Apache 2.2 升级到 RHEL7/Apache 2.4,并且此配置以前可以正常工作,所以我可能在升级到新配置时遗漏了一些东西。

请原谅代码块中的任何拼写错误。代码不是复制粘贴的,实际代码中不存在任何拼写错误。

【问题讨论】:

(旁白)“请原谅代码块中的任何拼写错误。” - 在发布前需要确保代码中没有错别字;你只有5行?!问题中的代码 sn-ps 中的错别字是一个巨大的混乱来源。 您正在加载变量$host,并且您正在打印变量$hostname。它不是同一个变量。 该变量在实际代码中是正确的,这是手动将其复制到此处时的拼写错误。我通过向 conf 文件添加额外权限解决了我的问题。 【参考方案1】:

do 读取文件并将其作为 Perl 代码执行 (evals)。如果失败,则什么也不会发生(默默地)。这就像忽略eval

requiredo 类似,但如果出现问题会抱怨(perldoc 条目显示实际行为)。您应该 require 该文件,这样它就可以告诉您某些事情没有发生。或者,至少,检查do 的结果,如果有问题,将$@ 发送到错误日志。

【讨论】:

【参考方案2】:

您假设当前目录设置为包含脚本的目录。

use FindBin qw( $RealBin );

do "$RealBin/../includes/cgi.conf";

【讨论】:

【参考方案3】:

我的问题是通过将 apache 用户的读取权限添加到配置文件来解决的。它仅具有旧服务器的执行权限,我认为这就是它在新服务器上所需要的全部。

【讨论】:

以上是关于Apache 未在包含的 perl 脚本中执行“do”包含函数的主要内容,如果未能解决你的问题,请参考以下文章

Apache服务器中运行CGI程序的方法,文中以Perl脚本作为示例

通过网页使 perl 脚本可执行

如何配置 Apache 2 以运行 Perl CGI 脚本?

如何使用 shell 脚本拦截 perl 脚本的执行,然后实际执行它们?

具有嵌入式 init.d 脚本的 Spring Boot 应用程序未在重新启动时启动

可以将 perl 脚本的执行权限限制为从另一个 perl 脚本调用吗?