11

Я пытаюсь определить, какая версия Linux-сервера запущена. Я не пытаюсь определить версию ядра - но оцениваю дистрибьютора.

gcc установлен, и в выводе версии написано RedHat

# gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11)

Означает ли это, что я могу смело предположить, что мой сервер является сервером RedHat. Есть ли лучший - 100% пуленепробиваемый метод, чтобы это выяснить? Также для других версий Linux - не только этот сервер?

Отредактируйте: содержимое /etc/ на случай, если это поможет - но я бы хотел решение, которое работает и для других версий linux.

# ls /etc/
./              backupmxhosts  domainusers     host.conf     localdomains  mailips        pam.d/      relayhosts               shadow              trustedmailhosts
../             bashrc*        exim.conf       inputrc       localtime     man.config     passwd      resolv.conf              skipsmtpcheckhosts  userdomains
DIR_COLORS      cron.deny      exim.pl         ld.so.cache   lynx.cfg      mtab           profile     secondarymx              spammeripblocks     vimrc
aliases         demodomains    exim.pl.local*  ld.so.conf    mail/         my.cnf         profile.d/  senderverifybypasshosts  sudoers
antivirus.exim  demouids       group           localaliases  mailhelo      nsswitch.conf  protocols   services                 termcap

У меня нет файлов *release или *version в /etc/

# ls /etc*release; ls /etc/*version
/bin/ls: /etc/*release: No such file or directory
/bin/ls: /etc/*version: No such file or directory

Я пробовал LSB

# lsb_release -a
LSB Version:
Distributor ID: n/a
Description:    (none)
Release:        n/a
Codename:       n/a

Кроме того - я думаю, что я нахожусь в chroot jail (не совсем уверен, что это такое), что может быть причиной этой проблемы.


Обновлено:

Я думаю, что это делает это для меня. Я думаю, что могу с уверенностью предположить, что я использую Cent-OS.

# cat /proc/version
Linux version 2.6.9-103.plus.c4smp (mockbuild@builder10.centos.org) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)) #1 SMP Wed Dec 21 16:17:23 EST 2011

10 ответов10

13

На большинстве современных дистрибутивов Linux следующая команда предоставит вам информацию:

lsb_release -a
9

/etc/issue может быть хорошей отправной точкой.

Более подробную информацию можно найти, просмотрев информационные файлы для различных дистрибутивов:

Novell SuSE    /etc/SuSE-release
OpenSuSE       /etc/SuSE-release, /etc/os-release
Red Hat,CentOS /etc/redhat-release, /etc/redhat_version
Fedora         /etc/fedora-release, /etc/redhat-release, /etc/os-release
Slackware      /etc/slackware-release, /etc/slackware-version
Debian         /etc/debian_release, /etc/debian_version
Mandrake       /etc/mandrake-release
Yellow dog     /etc/yellowdog-release
Sun JDS        /etc/sun-release 
Solaris/Sparc  /etc/release 
Gentoo         /etc/gentoo-release
Amazon Linux   /etc/system-release
PLD Linux      /etc/pld-release, /etc/os-release
ArchLinux      /etc/arch-release, /etc/os-release

Смотрите форум Unix для более подробной информации.

4

Если /etc/issue отсутствует, возможно, существует один или несколько файлов /etc/*_release .

Например, моя система Ubuntu имеет /etc/lsb-release:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.04
DISTRIB_CODENAME=natty
DISTRIB_DESCRIPTION="Ubuntu 11.04"

Система CentOS друга (на основе Red Hat) имеет /etc/redhat-release:

CentOS release 5.6 (Final)

Я не знаю, насколько это универсально.

4
cat /proc/version

Примеры:

  1. Ubuntu:

    $ cat /proc/version
    Linux version 3.11.0-13-generic (buildd@roseapple) (gcc version 4.8.1 \
    (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013
    
  2. Red Hat / CentOS:

    $ cat /proc/version
    Linux version 2.6.32-220.13.1.el6.x86_64 (mockbuild@c6b6.bsys.dev.centos.org) \
    (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Apr 17 23:56:34 BST 2012
    

Смотрите также Как узнать, какой дистрибутив Linux вы используете?

2

cat /etc /issue может ответить на ваш вопрос.

Создатели дистрибутивов не дружат с вами здесь. Во-первых, каждый думает, что это единственный верный путь.

Скорее всего, вместо того, чтобы пытаться понюхать дистрибутив, вам следует более подробно рассмотреть конкретный вопрос, на который вам действительно нужно ответить. Сосредоточьтесь на функциональности, которую вы смотрите, а не на дистрибутив, предоставляющий ее. В конце концов, новая версия дистрибутива может развернуться и пойти в противоположном направлении по любой конкретной оси.

1

Используйте facter (да, именно так оно и пишется).

Facter является дополнением к марионетке, он предоставляет переменные, которые могут быть запрошены, которые содержат информацию о системе.

Например, вот лишь несколько из десятков переменных, которые может возвращать фактор

$ facter
...
operatingsystem => CentOS
operatingsystemmajrelease => 6
operatingsystemrelease => 6.4
osfamily => RedHat
...

Вы можете просто запросить факт osfamily, чтобы увидеть, что сервер работает RedHat

$ facter osfamily
RedHat

Ознакомьтесь с документацией: http://puppetlabs.com/facter

0

uname -a

Работает всегда для любого смокинга

0

Не существует единого надежного способа сделать это. Я задал похожий вопрос на unix.se, и лучший способ получить эту информацию - это скрипт, который проверяет различные источники:

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

Другой вариант - использование gcc --version , поскольку gcc всегда компилируется для конкретного дистрибутива, это будет относительно переносимо. Я настоятельно рекомендую вам прочитать принятый ответ на мой вопрос в U & L, это очень хорошо объясняет ситуацию.

0

Эта команда работала для дистрибутивов на основе Debian и Redhat: Используя фильтр tr, вы конвертируете документ в формат по одному слову на строку, а затем подсчитываете первую строку, содержащую имя дистрибутива.

tr -s ' \011' '\012' < /etc/issue | head -n 1
-1

Thos - лучший метод

cat /etc/*release

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .