如何查看Perl是否已安装插件

时间:2012-03-21 08:27:47

标签: perl plugins

我有一个Perl脚本,需要一些插件,用于istance nmap。如何查看插件是否已安装,如果不安装,请安装它们?我尝试使用以下代码,但它不能很好地工作,我想要做的是捕获“bash:nmap:command not found”输出。我尝试了stdout和stderr。

print "Checking nmap...\n";

my ($stdout, $stderr) = capture {
    system("nmap");
};

if ($stdout=~m/command not found/) {
    print "nmap not found, installing...\n";
    system("rpm -i nmap-4.75-1.26.x86_64.rpm");
}

else {
    print "nmap is already installed.\n";
}

3 个答案:

答案 0 :(得分:4)

  

如何查看插件是否已安装,如果不安装,请安装它们?

This is not a good idea,不要在运行时检查依赖项。相反,您声明您的发行版元文件中的依赖项,并在构建时检查它们,并可能中止构建。最简单的方法是使用requires_external_bin from Module::Install。这很好地集成到现有的RPM基础设施中。 - 换句话说,了解包装的基本知识以及解决的问题。

如果您不能依赖有权在系统范围内安装它的用户,请创建一个Alien发行版,下载源并将其安装到共享树中。但是一旦你走下那个兔子洞,要注意它很深 - 你还需要以某种方式照顾deps of nmap itself

答案 1 :(得分:0)

这个怎么样?

my $cmd='which nmap';
my $output = `$cmd 2>&1`;
my $exit_value=$? >> 8;
if ($exit_value){
  print "not found $cmd, error: $output\n";
}else{
  print "Found $cmd at $output\n";
}

答案 2 :(得分:0)

就像daxim指出来自Module::Install::External的{​​{3}}是确保安装二进制文件的好方法。

如果您不能在您的应用程序中使用Module :: Install,您可以尝试搜索PATH环境变量,如下所示:

use File::Spec;

$\="\n";
print installed($_) ? "$_ installed" : "$_ not installed" for qw/nmap ls cat nosuchfile less/;

sub installed {
    my $name = shift;

    foreach my $path (File::Spec->path()) {
        my $bin = File::Spec->catfile($path, $name);
        return $bin if -e -f -x $bin;
    }
}

这应输出如下内容:

$ perl test.pl
nmap installed
ls installed
cat installed
nosuchfile not installed
less installed

这样做的缺点当然是你要找的二进制文件必须驻留在$ PATH中。