2012-03-21 47 views
1

我有一个Perl脚本,需要几个插件,用于istance nmap。我怎样才能看到插件是否已经安装,如果他们不是,安装它们?我尝试了下面的代码,但它不能很好地工作,我试图做的是捕获“bash:nmap:command not found”输出。我尝试了stdout和stderr。如何查看一个插件是否已经与Perl一起安装

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"; 
} 

回答

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"; 
} 
+0

你能解释第三行吗?我不喜欢使用我不明白的代码:D – raz3r 2012-03-21 09:12:53

+0

这是通常对'system'的错误检查。我只是简单地使用[File :: Which](http://p3rl.org/File::Which),或者如果'system'无法避免,至少[将错误检查留给IPC :: System :: Simple ](http://stackoverflow.com/a/3478060)。 – daxim 2012-03-21 11:44:31

+0

$?包含该命令的退出值。命令在shell中执行$ so?较低的128位包含外壳错误,较高的128位包含实际的脚本错误。 – user1126070 2012-03-21 11:45:21

4

我怎么能看到,如果插件已安装,并在情况下,他们都没有,安装它们?

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

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

+0

所有这些的目的都是为我的Perl套件实际创建一个安装程序。在安装额外的插件之前,这个“安装程序”会安装Perl依赖项。 – raz3r 2012-03-22 11:12:50

+0

[Module :: Install](http://p3rl.org/Module:Install)(或[Module :: Build](http://p3rl.org/Module::Build)或[MakeMaker](http: //p3rl.org/ExtUtils::MakeMaker))是安装程序。你为什么要发明自己的? – daxim 2012-03-22 11:25:42

+0

我正在读Module :: Install documentation,但是我的问题是这个模块需要安装还是它是核心模块?我的设置需要在可能没有任何东西的机器上运行。 – raz3r 2012-03-22 11:50:11

0

像daxim指出requires_external_binModule::Install::External是确保您的二进制文件安装的好方法。

如果您不能使用模块::安装在你的应用程序,你可以尝试搜索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中。

+0

上面的路径搜索代码的彻底调试,可移植化身可从CPAN [File :: Which](http://p3rl.org/File::Which)获得。 – daxim 2012-03-22 11:28:05

相关问题