Perl 无法识别 root 用户的模块/模块路径

Posted

技术标签:

【中文标题】Perl 无法识别 root 用户的模块/模块路径【英文标题】:Perl not recognizing module / module path for root user 【发布时间】:2021-05-12 15:32:27 【问题描述】:

我是 Perl 新手,所以请多多包涵。感谢您的帮助。

我有一台装有 Perl 的 Ubuntu 机器。我关注了local::lib bootstrapping guide

我使用 cpanm 将 DBI 和其他模块安装到我的系统中。我担心我的系统上可能还有其他可用的 DBI 模块,这可能是问题的一部分。这是find / -name 'DBI.pm' 2>/dev/null的结果:

/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/blib/lib/DBI.pm
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/blib/lib/Bundle/DBI.pm
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/DBI.pm
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/lib/Bundle/DBI.pm
/home/ubuntu/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/DBI.pm
/home/ubuntu/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Bundle/DBI.pm

我在 .bashrc 文件中添加了 2 行。 (我添加了第二行,因为我为非 root 用户破坏了一些东西并修复了它;也许我用 local::lib 破坏了一些东西?)

eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"
PERL5LIB="/home/ubuntu/perl5/lib/perl5"

我可以以非 root 用户身份运行我的 perl 脚本。 如果我使用sudo perlScript.pl 运行,我会收到此错误:Can't locate DBI.pm in @INC (you may need to install the DBI module)

我已经对@INC 进行了一段时间的故障排除,但无法弄清楚如何为 root 用户调整它。我尝试了各种方法,包括将 PERL5LIB 添加到 .profile 并像这样调用我的脚本:sudo sh -c '. ~/.profile; perl ~/perlScripts/perlScript.pl "argForScript"'(我验证了 PERL5LIB 设置为 sudo sh -c '. ~/.profile; echo $PERL5LIB'

但是我总是收到@INC 错误。我注意到的最明显的事情是比较sudo perl -Vperl -V。 sudo 调用不显示任何 ENV 变量,并且 @INC 不包括所需的 PERL5LIB 位置。非 sudo 调用确实显示了所需的 ENV 和 @INC 变量。

我正在考虑擦除内容并使用 root 权限对 local::lib 和 cpan 进行全新安装。目前还不确定还可以尝试什么。

【问题讨论】:

你为什么要为用户 'ubuntu' 建立一个本地库,而不是在最后你的脚本必须以 'root' 运行时全局安装 Perl 模块? "如果我使用 sudo ..." 你为什么要使用 sudo 运行它?当您安装 local::lib 时,您为用户 ubuntu 安装了它,因此它不适用于像 root 这样的其他用户 Re "我正在考虑擦除内容并使用 root 权限对 local::lib 和 cpan 进行全新安装。目前还不确定还可以尝试什么。" , 这不会阻止 sudo 不传递 PERL5LIB。在 sudo 中设置 PERL5LIB 就可以了。 我更喜欢安装我自己的 Perl 而不是使用 local::lib。 perlbrew 可以提供帮助。 如果你为 'ubuntu' 用户安装 / 拥有的模块,然后让 root 用户使用它们,你现在有一个安全漏洞,ubuntu 用户可以升级到 root 权限。 root 执行的东西应该归 root 所有。 【参考方案1】:

这些是最终为我工作的命令。我用 local::lib / non-sudo cpan install 破坏了我的第一个环境,所以我设置了一个新的 VM。

sudo apt install make
sudo apt install build-essential
sudo apt install libmysqlclient-dev
sudo cpan App::cpanminus
cpanm --sudo DBI
cpanm --sudo Array::Utils
cpanm --sudo DBD::mysql

【讨论】:

以上是关于Perl 无法识别 root 用户的模块/模块路径的主要内容,如果未能解决你的问题,请参考以下文章

perl 下使用非root用户安装模块

perl模块安装——cpanm

如何在没有 root 权限的情况下安装 Perl 模块?

非[无]root权限 服务器 下安装perl以及perl模块--转载

如何使用 Perl 中的 Win32::LongPath 模块来操作长路径名?

从cron.daily运行时,Perl无法找到模块