【问题标题】:Centos 8 Perl modules location [duplicate]Centos 8 Perl模块位置[重复]
【发布时间】:2021-03-15 13:30:20
【问题描述】:

我刚刚在我的服务器上安装了 Centos 8,以便将所有内容从 Centos 7 迁移到 Centos 8。我使用了许多用于 Web 服务器 (Apache) 的自定义编写的 Perl CGI 脚本。这些脚本有许多他们使用的 .pm 模块。包含来自 .cgi 脚本文件的模块 'use' 正在使用。例如:

/cgi-bin/somescript.cgi

#!/usr/bin/perl
use some_module;

在上面的示例中,some_module.pm 位于 /cgi-bin 内,但是当我尝试运行 http://192.168.0.1/cgi-bin/somescript.cgi 时出现以下错误: 在@INC 中找不到 some_module.pm

这曾经在 Centos 7 中完美地工作,但在 Centos 8 中却没有。当 .cgi 脚本文件是执行了吗?

【问题讨论】:

标签: apache perl centos8


【解决方案1】:

Centos 7 包括 Perl 5.16.3。 Centos 8 包括 Perl 5.26.3。这是五个主要版本(5.18、5.20、5.22、5.24 和 5.26)的差异。在版本进行如此大的飞跃之前,最好阅读相关的 perldelta 手册页。

perl5260delta,你会发现这个:

从@INC 中删除当前目录(“.”)

perl 二进制文件在@INC 中包含一组默认路径。从历史上看,它还包括当前目录(“.”)作为最终条目,除非在启用污染模式(perl -T)的情况下运行。虽然很方便,但也有安全隐患:例如,如果脚本在其当前目录不受信任(例如 /tmp)时尝试加载可选模块,它可以从该目录下加载和执行代码。

从 v5.26 开始,“.”默认情况下总是被删除,而不仅仅是在污染下。这对安装模块和执行脚本有重大影响。

所以通过更新到这个版本,你已经破坏了你的代码。

恢复先前行为的简单(但不明智的)修复是将其添加到文件顶部附近(在它尝试加载库之前):

use lib '.';

但是,不建议这样做,因为当您的代码不是从包含您的代码的目录中运行时,它会中断。更好的解决方法一直是添加一个相对于包含主程序的目录的库路径。可能看起来像这样:

use FindBin '$RealBin';
use lib $RealBin;

【讨论】:

    【解决方案2】:

    正如@choroba 在他们的评论中指出的那样,. 不再在@INC 的默认路径列表中。您可以使用use lib添加库路径:

    use lib '/cgi-bin';

    use lib '/var/www/cgi-bin';

    (以更准确反映您的图书馆位置的为准。)

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2013-05-29
      • 1970-01-01
      • 2010-10-21
      相关资源
      最近更新 更多