Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从shell脚本运行perl脚本_Perl_Shell - Fatal编程技术网

从shell脚本运行perl脚本

从shell脚本运行perl脚本,perl,shell,Perl,Shell,我已经编写了一个shell脚本,它可以在Centos64上运行 在这个脚本的末尾,我运行了一个perl脚本 它可以作为root用户使用(我已经安装了perl模块),但是当我作为系统用户运行它时 我得到的信息是: /UserActivityReport.sh 在@INC中找不到MIME/Lite.pm(@INC包含:/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/usr/lib/perl5/site_perl/5.8.8/usr

我已经编写了一个shell脚本,它可以在Centos64上运行

在这个脚本的末尾,我运行了一个perl脚本

它可以作为root用户使用(我已经安装了perl模块),但是当我作为系统用户运行它时

我得到的信息是:

/UserActivityReport.sh
在@INC中找不到MIME/Lite.pm(@INC包含:/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/usr/lib/perl5/site_perl/5.8.8/usr/libl5/site_perl/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-linux-thread-multi/usr/lib/vendor_perl/5.8.8/usr/lib/lib/perl5.8/vendoor/vendoor_perl供应商_perl perl/usr/usr/usr/usr/lib.64/lib.8/x88/x88/linux-perl5.8/perl.8/perl.8/perl.64-perl在/optreports/sendmailUAR.pl第3行。
BEGIN失败--编译在/opt/reports/sendmailUAR.pl第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的umask是这样的,默认情况下文件不是世界可读的

find /usr/lib/perl5 -not -perm -o=r 
列出的任何文件都不是世界可读的(并且可能应该是)。您可以通过这种方式修复它

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

如果您希望使所有与第一个命令匹配的文件都可读。

MIME::Lite
位于
/usr/lib/perl5/site\u perl/5.8.8/MIME/Lite.pm
/usr/lib/perl5/site\u perl/5.8.8
位于系统的
@INC
路径中

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

cat /usr/lib/perl5/site_perl/5.8.8/MIME/Lite.pm
如果执行此操作时出错,请检查文件和父目录的权限


否则,使用
strace
system
的形式运行脚本,并查看它找不到模块文件的原因。

在其中一条注释中,您发布了如下目录列表:

[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\u perl/5.8.8-type d-exec chmod a+rx{}\;

以root
perl-MMIME::Lite-MData::Dumper-e'print Dumper\%INC'
运行,并在此处发布输出。系统用户的@INC中似乎没有
/usr/lib/perl5/site\u perl/5.8.8/
。请查看:文件是否存在?其权限是什么?@Lin怎么回事?根据错误消息,它包含在\@INC中鼠尾草#ls-l/usr/lib/perl5/site_perl/5.8.8/total 60 drwxr-x---3 root根4096 Sep 14 13:09日期drwxr-x---3 root根4096 Sep 14 13:09电子邮件drwxr-x---4 root根4096 Sep 14 13:10 Mail drwxr-x---2 root根根4096 Sep 14:10 MIME drwxr-x---2根根4096 Sep 15 06:30 OLE drwxr-x---根解析4096 Sep 15 06:30 drwxr-x---2根根根解析4096年9月14日13:10 Pod drwxr-x---3个根目录4096年9月15日06:30电子表格drwxr-x---2个根目录4096年9月14日13:09时间-r--r--1个根目录6500年8月21日07:19版本.pm--r--r--r--1个根目录9887年8月21日07:12版本。好吧,我在/usr/lib perl5/site_perl/5.8.8上做了一个chmod 755,解决了这个问题:)