从Shell脚本运行Perl脚本

3
我编写了一个在Centos64上进行操作的shell脚本。
在脚本末尾,我运行了一个perl脚本。
当我以系统用户身份运行它时,它可以正常工作(我已经安装了perl模块),但是当我以系统用户身份运行时,
我会收到以下消息:
./UserActivityReport.sh Can't locate MIME/Lite.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /optreports/sendmailUAR.pl line 3. BEGIN failed--compilation aborted at /opt/reports/sendmailUAR.pl line 3.
就好像该用户未安装模块一样...
我使用以下命令在我的shell脚本中运行该脚本:
/usr/bin/perl  /opt/reports/sendmailUAR.pl

为什么它不能运行?

注意:我无法使用系统用户安装perl模块。

===

perl -MMIME::Lite -MData::Dumper -e'print Dumper \%INC'
$VAR1 = {
          're.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/re.pm',
          'warnings/register.pm' => '/usr/lib/perl5/5.8.8/warnings/register.pm',
          'XSLoader.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/XSLoader.pm',
          'IO/Handle.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/IO/Handle.pm',
          'MIME/Types.pm' => '/usr/lib/perl5/site_perl/5.8.8/MIME/Types.pm',
          'SelectSaver.pm' => '/usr/lib/perl5/5.8.8/SelectSaver.pm',
          'IO/Seekable.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/IO/Seekable.pm',
          'warnings.pm' => '/usr/lib/perl5/5.8.8/warnings.pm',
          'File/Basename.pm' => '/usr/lib/perl5/5.8.8/File/Basename.pm',
          'Fcntl.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/Fcntl.pm',
          'IO.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/IO.pm',
          'Symbol.pm' => '/usr/lib/perl5/5.8.8/Symbol.pm',
          'bytes.pm' => '/usr/lib/perl5/5.8.8/bytes.pm',
          'MIME/Type.pm' => '/usr/lib/perl5/site_perl/5.8.8/MIME/Type.pm',
          'Carp.pm' => '/usr/lib/perl5/5.8.8/Carp.pm',
          'MIME/Base64.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/MIME/Base64.pm',
          'Exporter/Heavy.pm' => '/usr/lib/perl5/5.8.8/Exporter/Heavy.pm',
          'File/Spec/Unix.pm' => '/usr/lib/perl5/5.8.8/File/Spec/Unix.pm',
          'FileHandle.pm' => '/usr/lib/perl5/5.8.8/FileHandle.pm',
          'strict.pm' => '/usr/lib/perl5/5.8.8/strict.pm',
          'Exporter.pm' => '/usr/lib/perl5/5.8.8/Exporter.pm',
          'vars.pm' => '/usr/lib/perl5/5.8.8/vars.pm',
          'MIME/Lite.pm' => '/usr/lib/perl5/site_perl/5.8.8/MIME/Lite.pm',
          'MIME/QuotedPrint.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/MIME/QuotedPrint.pm',
          'File/Spec.pm' => '/usr/lib/perl5/5.8.8/File/Spec.pm',
          'overload.pm' => '/usr/lib/perl5/5.8.8/overload.pm',
          'IO/File.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/IO/File.pm',
          'Mail/Address.pm' => '/usr/lib/perl5/site_perl/5.8.8/Mail/Address.pm',
          'Data/Dumper.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/Data/Dumper.pm'

};


以 root 身份运行 perl -MMIME::Lite -MData::Dumper -e'print Dumper \%INC' 并将输出在此处发布。 - salva
系统用户的@INC似乎没有/usr/lib/perl5/site_perl/5.8.8/。请参考:https://dev59.com/dnE85IYBdhLWcg3w9ohJ - Jon Lin
文件在那里没错...它的权限是什么? - tripleee
@Lin 怎么会这样?根据错误信息,它已经包含在 @INC 中了。 - tripleee
是的,它已经通过CPAN安装了: [cipadmin@]$ locate Lite.pm /home/cipadmin/.cpan/build/MIME-Lite-3.027/blib/lib/MIME/Lite.pm /home/cipadmin/.cpan/build/MIME-Lite-3.027/lib/MIME/Lite.pm - Rgonomike
显示剩余4条评论
3个回答

2
在其中一条评论中,您发布了如下的目录列表:
[root~]# ls -l /usr/lib/perl5/site_perl/5.8.8/
total 60
drwxr-x--- 3 root root 4096 Sep 14 13:09 Date
drwxr-x--- 3 root root 4096 Sep 14 13:09 Email
drwxr-x--- 4 root root 4096 Sep 14 13:10 Mail
drwxr-x--- 2 root root 4096 Sep 14 13:10 MIME
drwxr-x--- 2 root root 4096 Sep 15 06:30 OLE
drwxr-x--- 2 root root 4096 Sep 15 06:30 Parse
drwxr-x--- 2 root root 4096 Sep 14 13:10 Pod
drwxr-x--- 3 root root 4096 Sep 15 06:30 Spreadsheet
drwxr-x--- 2 root root 4096 Sep 14 13:09 Time
-r--r--r-- 1 root root 6500 Aug 21 07:19 version.pm
-r--r--r-- 1 root root 9887 Aug 21 07:12 version.pod

很明显除了root用户,其他用户无法访问这些文件。您可能需要更彻底的审核,循环遍历所有的@INC并根据需要更改权限,但作为开始,可以执行以下命令:find /usr/lib/perl5/site_perl/5.8.8 -type d -exec chmod a+rx {} \;


1

我打赌root的umask是这样的,即文件默认情况下不可被全球读取。

find /usr/lib/perl5 -not -perm -o=r 

任何列出的文件都不是全局可读的(可能应该是)。您可以通过以下方式修复它

find /usr/lib/perl5 -not -perm -o=r -exec chmod o+r {} +

如果您希望让第一个命令匹配的所有文件对每个人都可读,请执行以下操作。

1

MIME::Lite 位于 /usr/lib/perl5/site_perl/5.8.8/MIME/Lite.pm,而 /usr/lib/perl5/site_perl/5.8.8 在系统的 @INC 路径中。

作为用户 system,请检查您是否可以读取该文件:

cat /usr/lib/perl5/site_perl/5.8.8/MIME/Lite.pm

如果在执行过程中出现错误,请检查文件和父目录的权限。
否则,以system方式运行脚本,并使用strace查看为什么无法找到模块文件。

1
好的,我在 /usr/lib/perl5/site_perl/5.8.8 上执行了 chmod 755,问题得到了解决 :) - Rgonomike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接