Centos 8 Perl模块位置[重复]

Posted

技术标签:

【中文标题】Centos 8 Perl模块位置[重复]【英文标题】:Centos 8 Perl modules location [duplicate] 【发布时间】: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 脚本文件是执行了吗?

【问题讨论】:

masteringperl.org/2017/01/… 【参考方案1】:

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

perl5180delta perl5200delta perl5220delta perl5240delta perl5260delta

在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';

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

【讨论】:

以上是关于Centos 8 Perl模块位置[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何找出 Perl 模块的安装位置?

安装 CPAN 模块时如何指定外部库文件位置

centos环境下使用CPAN安装perl模块

Perl 输出内容到 excel

如何在 Perl 中获取调用堆栈列表?

centos httpd.conf 多个子域不同位置