我有一个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";
}
答案 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中。