Подтвердить что ты не робот

Лучший способ найти имя и версию os на платформе Unix/Linux

Мне нужно найти имя и версию ОС на платформе Unix/Linux. Для этого я попробовал следующее:

  1. утилита lsb_release

  2. /etc/redhat-release или конкретный файл

Но, похоже, это не лучшее решение, так как поддержка LSB_RELEASE больше не предназначена для RHEL 7.

Есть ли способ, который будет работать на любой платформе Unix или Linux?

4b9b3361

Ответ 1

Эта работа отлично подходит для всей среды Linux.

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

В Ubuntu:

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

или 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"

В RHEL:

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

Или используйте этот 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}

Ответ 2

Следуя команде, я разработал у меня красиво. Он дает вам имя и версию ОС.

lsb_release -a

Ответ 3

Команда "lsb_release" предоставляет определенную стандартную базу Linux и информацию, относящуюся к распространению. Таким образом, используя приведенную ниже команду, мы можем получить имя операционной системы и версию операционной системы.

" lsb_release -a "

Ответ 4

С и Linux::Distribution, самое чистое решение для старой проблемы:

#!/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";
    }
'

Ответ 5

В каждом дистрибутиве есть файлы различий, поэтому я пишу самые распространенные:

---- 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'

в последнем /etc/issue не существовало, поэтому я попробовал второй, и он вернул правильный ответ

Ответ 6

Мой собственный сценарий @kvivek с более легким машинным анализом:

#!/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}"

ПРИМЕЧАНИЕ. Проверено только на Debian 11

Примеры запусков

Без аргументов

osInfo

выход:

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

Заголовок с именами и пользовательским разделителем

osInfo --names -s "\t| "

выход:

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

Отфильтрованный вывод

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

выход:

Debian 10.0 (buster)

Ответ 7

Используйте следующую команду

lsb_release -irc

Моя ОС CentOs и выдает меня как

Distributor ID: CentOS
Description: CentOS Linux release 7.2.1511 (Core)
Release: 7.2.1511
Codename: Core

Ответ 8

С цитатами:

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

дает вывод как:

"CentOS Linux 7 (Core)"

Без кавычек:

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

дает вывод как:

CentOS Linux 7 (Core)