使用Perl检测操作系统类型

时间:2013-02-16 16:15:57

标签: perl operating-system

我想使用Perl来检测操作系统类型。

例如:

假设我有一个安装程序,以便知道安装程序需要运行哪些命令。我将不得不检测安装的操作系统,例如Linux。让我们说它是Linux。现在哪种类型的Linux?

  • Fedora的
  • Ubuntu的
  • CentOS的
  • 的Debian

我该怎么做?

6 个答案:

答案 0 :(得分:5)

第一步是检查$^O变量的输出。

如果输出是例如

  

的Linux

您需要更多处理来检测使用的分布。

请参阅perldoc perlvar

到目前为止,您可以运行lsb_release -a来查看使用的分配。

如果此命令不存在,您可以测试是否存在以下文件:

/etc/debian_version # debian or debian based
/etc/redhat-release # rpm like distro

其他文件测试示例: Detecting Underlying Linux Distro


使用Linux::Distribution模块检查分发情况也可以考虑xaxes' solution


如果要检测包管理器,可以尝试这种方法:

 if ($^O eq "linux") {
     my $pm;

     do{
         if (-x qx(type -p $_ | tr -d "\n")) {
             $pm = $_;
             last;
         }
     } for qw/apt-get aptitude yum emerge pacman urpmi zypper/;

     print $pm;
 }

答案 1 :(得分:5)

此外,您可以使用Config(它是核心模块)。这是一个例子:

use Config;
print "$Config{osname}\n";
print "$Config{archname}\n";

在我的Mac OS X上,它会打印:

darwin
darwin-2level

答案 2 :(得分:5)

根据perlvar$OSNAME$^O将为您提供操作系统。这也相当于使用$Config{'osname'}(有关详情,请参阅Config)。 Windows系统的特别说明:

  

在Windows平台上,$^O不是很有帮助:因为它总是 MSWin32 ,所以它不能区分95/98 / ME / NT / 2000 / XP / CE / .NET。使用Win32::GetOSName()Win32::GetOSVersion()(请参阅Win32perlport)来区分变体。

为了获得Linux盒子的确切平台,你需要使用像他的答案中提到的xaxes这样的模块。

答案 3 :(得分:1)

要确定您的脚本运行的操作系统,可以使用$^O

print $^O

Linux::Distribution检查分发:

use Linux::Distribution qw(distribution_name distribution_version);

my $linux = Linux::Distribution->new;
if (my $distro = $linux->distribution_name()) {
      my $version = $linux->distribution_version();
      print "you are running $distro, version $version\n";
} else {
      print "distribution unknown\n";
}

答案 4 :(得分:0)

您可以检查文件-/ etc / os-release:

#!/usr/bin/perl

use feature(say);
use strict;
use warnings;


my %os=();

unless ( open(OS,"cat /etc/os-release|") ){
        say "ErrorOpenPipe OS_release";
        exit;
}

while (<OS>){
        my @os_param = split /=/, $_;
        $os{$os_param[0]}=$os_param[1];
}


my @FH;

say $os{ID};
say $os{VERSION_ID};

根据需要使用其他键:

$ cat /etc/os-release 

NAME="Ubuntu"
VERSION="16.04.5 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

$ cat /etc/os-release 

NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

答案 5 :(得分:0)

这在Redhat或CentOS上很好用,很容易调整为其他人...

# Test for release file
my $release_file="";
if ( -e "/etc/redhat-release" ) {
  $release_file="/etc/redhat-release";
} elsif ( -e "/etc/centos-release" ) {
  $release_file="/etc/centos-release";
} elsif ( -e "/etc/system-release" ) {
  $release_file="/etc/system-release";
} else {
  print "OS Release file missing, can't determine version information";
  exit;
}

my $OS_NAME=`cat $release_file|cut -d " " -f1`;
my $OS_MAJOR_VERSION=`sed -rn 's/^[^0-9]*([0-9]+)\\.[0-9]+.*/\\1/p' $release_file`;
my $OS_MINOR_VERSION=`sed -rn 's/^[^0-9]*[0-9]+.([0-9]+).*/\\1/p' $release_file`;

chomp($OS_NAME);
chomp($OS_MAJOR_VERSION);
chomp($OS_MINOR_VERSION);

print "\nOS Name and Version: ${OS_NAME} ${OS_MAJOR_VERSION}.${OS_MINOR_VERSION}\n\n";