在 Unix/Linux 平台上查找 OS 名称和版本的最佳方法

我需要在 Unix/Linux 平台上找到操作系统的名称和版本:

  1. lsb_release实用程序

  2. /etc/redhat-release或特定文件

但它似乎不是最好的解决方案,因为 LSB _ RELEASE 不再支持 RHEL 7。

有什么办法可以在任何 Unix 或 Linux 平台上工作吗?

142633 次浏览

With and Linux::Distribution, the cleanest solution for an old problem :

#!/bin/sh


perl -e '
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";
print " version $version" if $version;
print "\n";
} else {
print "distribution unknown\n";
}
'

This work fine for all Linux environment.

#!/bin/sh
cat /etc/*-release

In Ubuntu:

$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.4 LTS"

or 12.04:

$ cat /etc/*-release


DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"
NAME="Ubuntu"
VERSION="12.04.4 LTS, Precise Pangolin"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu precise (12.04.4 LTS)"
VERSION_ID="12.04"

In RHEL:

$ cat /etc/*-release
Red Hat Enterprise Linux Server release 6.5 (Santiago)
Red Hat Enterprise Linux Server release 6.5 (Santiago)

Or Use this Script:

#!/bin/sh
# Detects which OS and if it is Linux then it will detect which Linux
# Distribution.


OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`


GetVersionFromFile()
{
VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}


if [ "${OS}" = "SunOS" ] ; then
OS=Solaris
ARCH=`uname -p`
OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
elif [ "${OS}" = "AIX" ] ; then
OSSTR="${OS} `oslevel` (`oslevel -r`)"
elif [ "${OS}" = "Linux" ] ; then
KERNEL=`uname -r`
if [ -f /etc/redhat-release ] ; then
DIST='RedHat'
PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
elif [ -f /etc/SuSE-release ] ; then
DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
elif [ -f /etc/mandrake-release ] ; then
DIST='Mandrake'
PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
elif [ -f /etc/debian_version ] ; then
DIST="Debian `cat /etc/debian_version`"
REV=""


fi
if [ -f /etc/UnitedLinux-release ] ; then
DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
fi


OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"


fi


echo ${OSSTR}

Following command worked out for me nicely. It gives you the OS name and version.

lsb_release -a

The "lsb_release" command provides certain Linux Standard Base and distribution-specific information. So using the below command we can get Operating system name and operating system version.

"lsb_release -a"

In every distribute it has difference files so I write most common ones:

---- CentOS Linux distro
`cat /proc/version`
---- Debian Linux distro
`cat /etc/debian_version`
---- Redhat Linux distro
`cat /etc/redhat-release`
---- Ubuntu Linux distro
`cat /etc/issue`   or   `cat /etc/lsb-release`

in last one /etc/issue didn't exist so I tried the second one and it returned the right answer

My own take at @kvivek's script, with more easily machine parsable output:

#!/bin/sh
# Outputs OS Name, Version & misc. info in a machine-readable way.
# See also NeoFetch for a more professional and elaborate bash script:
# https://github.com/dylanaraps/neofetch


SEP=","
PRINT_HEADER=false


print_help() {


echo "`basename $0` - Outputs OS Name, Version & misc. info"
echo "in a machine-readable way."
echo
echo "Usage:"
echo "    `basename $0` [OPTIONS]"
echo "Options:"
echo "    -h, --help           print this help message"
echo "    -n, --names          print a header line, naming the fields"
echo "    -s, --separator SEP  overrides the default field-separator ('$SEP') with the supplied one"
}


# parse command-line args
while [ $# -gt 0 ]
do
arg="$1"
shift # past switch


case "${arg}" in
-h|--help)
print_help
exit 0
;;
-n|--names)
PRINT_HEADER=true
;;
-s|--separator)
SEP="$1"
shift # past value
;;
*) # non-/unknown option
echo "Unknown switch '$arg'" >&2
print_help
;;
esac
done


OS=`uname -s`
DIST="N/A"
REV=`uname -r`
MACH=`uname -m`
PSUEDONAME="N/A"


GetVersionFromFile()
{
VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}


if [ "${OS}" = "SunOS" ] ; then
DIST=Solaris
DIST_VER=`uname -v`
# also: cat /etc/release
elif [ "${OS}" = "AIX" ] ; then
DIST="${OS}"
DIST_VER=`oslevel -r`
elif [ "${OS}" = "Linux" ] ; then
if [ -f /etc/redhat-release ] ; then
DIST='RedHat'
PSUEDONAME=`sed -e 's/.*\(//' -e 's/\)//' /etc/redhat-release `
DIST_VER=`sed -e 's/.*release\ //' -e 's/\ .*//' /etc/redhat-release `
elif [ -f /etc/SuSE-release ] ; then
DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
DIST_VER=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
elif [ -f /etc/mandrake-release ] ; then
DIST='Mandrake'
PSUEDONAME=`sed -e 's/.*\(//' -e 's/\)//' /etc/mandrake-release`
DIST_VER=`sed -e 's/.*release\ //' -e 's/\ .*//' /etc/mandrake-release`
elif [ -f /etc/debian_version ] ; then
DIST="Debian"
DIST_VER=`cat /etc/debian_version`
PSUEDONAME=`lsb_release -a 2> /dev/null | grep '^Codename:' | sed -e 's/.*[[:space:]]//'`
#elif [ -f /etc/gentoo-release ] ; then
#TODO
#elif [ -f /etc/slackware-version ] ; then
#TODO
elif [ -f /etc/issue ] ; then
# We use this indirection because /etc/issue may look like
# "Debian GNU/Linux 10 \n \l"
ISSUE=`cat /etc/issue`
ISSUE=`echo -e "${ISSUE}" | head -n 1 | sed -e 's/[[:space:]]\+$//'`
DIST=`echo -e "${ISSUE}" | sed -e 's/[[:space:]].*//'`
DIST_VER=`echo -e "${ISSUE}" | sed -e 's/.*[[:space:]]//'`
fi
if [ -f /etc/UnitedLinux-release ] ; then
DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
fi
# NOTE `sed -e 's/.*(//' -e 's/).*//' /proc/version`
#      is an option that worked ~ 2010 and earlier
fi


if $PRINT_HEADER
then
echo "OS${SEP}Distribution${SEP}Distribution-Version${SEP}Pseudo-Name${SEP}Kernel-Revision${SEP}Machine-Architecture"
fi
echo "${OS}${SEP}${DIST}${SEP}${DIST_VER}${SEP}${PSUEDONAME}${SEP}${REV}${SEP}${MACH}"

NOTE: Only tested on Debian 11

Example Runs

No args

osInfo

output:

Linux,Debian,10.0,buster,4.19.0-5-amd64,x86_64

Header with names and custom separator

osInfo --names -s "\t| "

output:

OS  | Distribution  | Distribution-Version  | Pseudo-Name   | Kernel-Revision   | Machine-Architecture
Linux   | Debian    | 10.0  | buster    | 4.19.0-5-amd64    | x86_64

Filtered output

osInfo | awk -e 'BEGIN { FS=","; } { print $2 " " $3 " (" $4 ")" }'

output:

Debian 10.0 (buster)

With quotes:

cat /etc/*-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g'

gives output as:

"CentOS Linux 7 (Core)"

Without quotes:

cat /etc/*-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/"//g'

gives output as:

CentOS Linux 7 (Core)

this command gives you a description of your operating system

cat /etc/os-release

I prepared following commands to find concise information about a Linux system:

clear
echo "\n----------OS Information------------"
hostnamectl | grep "Static hostname:"
hostnamectl | tail -n 3
echo "\n----------Memory Information------------"
cat /proc/meminfo | grep MemTotal
echo "\n----------CPU Information------------"
echo -n "Number of core(s): "
cat /proc/cpuinfo | grep "processor" | wc -l
cat /proc/cpuinfo | grep "model name" | head -n 1
echo "\n----------Disk Information------------"
echo -n "Total Size: "
df -h --total | tail -n 1| awk '{print $2}'
echo -n "Used: "
df -h --total | tail -n 1| awk '{print $3}'
echo -n "Available: "
df -h --total | tail -n 1| awk '{print $4}'
echo "\n-------------------------------------\n"

Copy and paste in an sh file like info.sh and then run it using command sh info.sh