Определить дистрибутив Linux

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(не совсем уверен, что это такое), что может быть причиной этой проблемы.


Обновлено:

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

# 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
Билли Мун
источник
Зачем тебе это знать? Возможно, вместо этого тестирование общих распространяемых инструментов (например, менеджеров пакетов) будет делать то, что вы хотите?
Даниэль Приден
1
Ну, что я действительно хочу знать, так это то, что я могу локально реплицировать сервер как виртуальную машину, а затем установить компоненты на локальную виртуальную машину, а затем скопировать двоичные файлы на удаленную машину. Я думал, что поиск правильной платформы будет хорошей отправной точкой.
Билли Мун
2
Приведенный выше список каталогов является неполным (например, отсутствуют hosts, init.d, rc *). Это тест?
Как вы получаете доступ к этому серверу? Возможно ли, что вы не имеете прямого доступа к файловой системе сервера, а вместо этого находитесь в изолированной тюрьме?
Даниэль Приден
Я думаю, что я мог бы быть в тюрьме chroot - это значит, что я не могу узнать, что лежит в основе системы?
Билли Мун

Ответы:

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 вы используете?

Витовт
источник
Это показывает, где было скомпилировано ядро, а не дистрибутив, на котором вы работаете. Во многих случаях ядро ​​компилируется в том же дистрибутиве, но в более старой версии.
Пабук
13

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

lsb_release -a
Alpha01
источник
1
Нет, это не так Это работает только для Debian и производных
MariusMatutiae
1
Эта команда не установлена ​​по умолчанию в Red Hat и ее производных (например, CentOS). Вы должны установить его в явном виде перед использованием: yum install redhat-lsb-core.
Пабук
@MariusMatutiae, на самом деле, он гораздо более распространен, но не всегда устанавливается по умолчанию.
тердон
@terdon спасибо, я этого не знал.
MariusMatutiae
@MariusMatutiae смотрите здесь для получения дополнительной информации, он, кажется, отсутствует в SuSe, но должен быть установлен на RH.
тердон
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 для более подробной информации.

e_z
источник
1
к сожалению, у меня нет файлов, заканчивающихся releaseили versionв моем etcкаталоге
Billy Moon
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)

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

Кит Томпсон
источник
нет releaseили versionфайлы в моем/etc/
Билли Мун
@BillyMoon Я полагаю, что только недавно дистрибутивы Linux начали добавлять утилиту lsb_release в свой дистрибутив. lsb_release -a
Alpha01
Спасибо за совет - на этот раз мне это не поможет, к сожалению
Билли Мун
2

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

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

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

bmargulies
источник
3
нет /etc/issueна моем сервере
Билли Мун
Да. Обратите внимание, что /etc/issueможет содержать escape-последовательности, такие как \nи \l. Чтобы увидеть, что они означают, man 5 issueи man getty( /etc/issueфайл предназначен в первую очередь для использования getty). Конечно, владелец системы может редактировать /etc/issueпо какой-то гнусной причине.
Кит Томпсон
Я не думаю, что /etc/issueон должен существовать или содержать какую-либо информацию о поставщике дистрибутива. Обычно так и есть, но я не думаю, что вы можете на это положиться.
Даниэль Приден
@DanielPryden хорошо каждый узнает кое-что каждый день. Я никогда не сталкивался с отсутствием одного раньше.
Bmargulies
1

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

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

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

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

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

$ facter osfamily
RedHat

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

spuder
источник
0

uname -a

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

Ленивый Барсук
источник
1
Это сообщает строку версии ядра , которая может быть очень неправильной, если на вашем хосте запущено ядро ​​из другого дистрибутива - либо на голом железе, либо из-за такого инструмента, как OpenVZ или VServers.
Сарнольд
Да, но я полагаю, что в этом случае автор Q будет знать что-то. о ситуации. «Чужое» ядро ​​довольно странное дело
Lazy Badger
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, это очень хорошо объясняет ситуацию.

terdon
источник
0

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

tr -s ' \011' '\012' < /etc/issue | head -n 1
Яхья Яхъяуи
источник
-1

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

cat /etc/*release
Унникришнан
источник
Я перечислил мой /etcкаталог в вопросе. Как уже говорилось в других ответах, это решение не работает для меня.
Билли Мун
Вы пробовали релиз ls / etc *; , Это неверно. Попробуй ls / etc / * release. Это будет работать. Я уверен, что
Unnikrishnan
Я также сделал ls в /etc/каталоге, и вы можете видеть, что никакие файлы там не заканчиваютсяrelease
Билли Мун