【问题标题】:Running perl script from a shell script从 shell 脚本运行 perl 脚本
【发布时间】:2011-09-15 11:13:09
【问题描述】:

我写了一个在 Centos64 上运行的 shell 脚本

在这个脚本的最后,我运行了一个 perl 脚本。

它作为 root 可以正常工作(我已经安装了 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'并在此处发布输出。
  • 系统用户的@INC 中似乎没有/usr/lib/perl5/site_perl/5.8.8/。看看:*.com/questions/2526804/…
  • 文件在那里没问题...它的权限是什么?
  • @Lin 怎么会这样?根据错误消息,它包含在 \@INC 中。
  • [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

标签: perl shell


【解决方案1】:

在其中一个 cmets 中,您发布了这样的目录列表:

[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 {} \;

【讨论】:

    【解决方案2】:

    我打赌 root 的 umask 是默认情况下文件不是世界可读的。

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

    列出的任何文件都不是世界可读的(可能应该是)。你可以这样修复它

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

    如果你想让所有文件与第一个命令匹配,每个人都可以阅读。

    【讨论】:

      【解决方案3】:

      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
      

      如果出现错误,请检查文件和父目录的权限。

      否则,以systemstrace 运行脚本,看看为什么找不到模块文件。

      【讨论】:

      • 好吧,所以我在 /usr/lib/perl5/site_perl/5.8.8 上做了一个 chmod 755,它解决了这个问题 :)