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模块位置[重复]的主要内容,如果未能解决你的问题,请参考以下文章