我想使用 Perl 来检测操作系统类型。
例如:
假设我有一个安装程序,以便知道安装程序需要运行哪些命令。我必须检测安装了什么操作系统,例如 Linux。假设它是Linux。现在是哪种类型的 Linux?
- 软呢帽
- Ubuntu
- 中央操作系统
- Debian
- 等等
我该怎么做?
我想使用 Perl 来检测操作系统类型。
例如:
假设我有一个安装程序,以便知道安装程序需要运行哪些命令。我必须检测安装了什么操作系统,例如 Linux。假设它是Linux。现在是哪种类型的 Linux?
我该怎么做?
第一步是检查$^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;
}
此外,您可以使用 Config(它是一个核心模块)。这是一个例子:
use Config;
print "$Config{osname}\n";
print "$Config{archname}\n";
在我的 Mac OS X 上,它打印:
darwin
darwin-2level
根据perlvar,要么 要么$OSNAME
会给$^O
你操作系统。这也等同于使用$Config{'osname'}
(更多信息请参见配置)。Windows 系统的特别说明:
在 Windows 平台中,
$^O
它不是很有帮助:因为它始终是MSWin32,它不能区分 95/98/ME/NT/2000/XP/CE/.NET 之间的区别。使用Win32::GetOSName()
orWin32::GetOSVersion()
(参见Win32和perlport)来区分变体。
为了获得 Linux 机器的确切平台,您需要使用他的回答中提到的 xaxes 之类的模块。
要确定您的脚本在哪个操作系统上运行,您可以使用$^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";
}
这在 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";
您可以检查文件 - /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"