我想使用Perl来检测操作系统类型。
例如:
假设我有一个安装程序,以便知道安装程序需要运行哪些命令。我将不得不检测安装的操作系统,例如Linux。让我们说它是Linux。现在哪种类型的Linux?
我该怎么做?
答案 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()
(请参阅Win32和perlport)来区分变体。
为了获得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";