6

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

例如:

假设我有一个安装程序,以便知道安装程序需要运行哪些命令。我必须检测安装了什么操作系统,例如 Linux。假设它是Linux。现在是哪种类型的 Linux?

  • 软呢帽
  • Ubuntu
  • 中央操作系统
  • Debian
  • 等等

我该怎么做?

4

6 回答 6

6

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

如果输出是例如

linux

您需要更多处理来检测使用了哪个分布。

perldoc perlvar

到目前为止,您可以运行lsb_release -a以查看使用了哪个发行版。

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

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

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


也考虑使用该模块检查分布的xaxes 解决方案。Linux::Distribution


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

 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;
 }
于 2013-02-16T16:25:27.143 回答
5

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

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

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

darwin
darwin-2level
于 2013-02-16T16:31:12.997 回答
5

根据perlvar,要么 要么$OSNAME会给$^O你操作系统。这也等同于使用$Config{'osname'}(更多信息请参见配置)。Windows 系统的特别说明:

在 Windows 平台中,$^O它不是很有帮助:因为它始终是MSWin32,它不能区分 95/98/ME/NT/2000/XP/CE/.NET 之间的区别。使用Win32::GetOSName()or Win32::GetOSVersion()(参见Win32perlport)来区分变体。

为了获得 Linux 机器的确切平台,您需要使用他的回答中提到的 xaxes 之类的模块。

于 2013-02-16T16:32:58.020 回答
2

要确定您的脚本在哪个操作系统上运行,您可以使用$^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";
}
于 2013-02-16T16:25:28.050 回答
1

这在 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";
于 2020-09-11T22:03:38.260 回答
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"
于 2018-08-21T06:40:51.453 回答