Визначте дистрибутив 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(не дуже впевнений, що це таке), що, можливо, може стати причиною цього питання.


Оновлено:

Я думаю, що це робить це для мене. Я думаю, що можу з упевненістю припустити, що я використовую 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

Чому потрібно знати? Можливо, замість тестування на загальні інструменти, що стосуються розповсюдження (наприклад, менеджери пакунків), буде зроблено те, що ви хочете?
Даніель Приден

1
Ну, що я дійсно хочу знати, це якщо я можу реплікувати сервер як віртуальну машину локально, а потім встановити речі на локальній віртуальній машині, а потім скопіювати бінарні файли на віддалену машину. Я думав, що з’ясування правильної платформи буде гарною відправною точкою.
Біллі Мун

2
Вищенаведений перелік каталогів є неповним (наприклад, відсутні хости, init.d, rc *). Це тест?

Як ви отримуєте доступ до цього сервера? Можливо, ви не маєте доступу до файлової системи сервера безпосередньо, але натомість перебуваєте у в'язниці chroot?
Даніель Приден

Я думаю, що я міг би опинитися у в'язниці 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 ви використовуєте?


Це показує, де було складено ядро, а не який дистрибутив. У багатьох випадках ядро ​​компілюється в одному і тому ж дистрибутиві, але в більш старій версії.
pabouk

13

У більшості сучасних дистрибутивів Linux наступна команда дасть вам свою інформацію:

lsb_release -a

1
Ні, це неправда. Це працює лише для Debian та похідних
MariusMatutiae

1
Ця команда не встановлена ​​за замовчуванням для Red Hat та похідних (тобто CentOS). Ви повинні встановити його в явному вигляді перед використанням: yum install redhat-lsb-core.
pabouk

@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 .


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 може відповісти на ваше запитання.

Створюючі дистрибутори тут не привітні до вас. По-перше, кожен думає, що це єдиний вірний шлях.

Швидше за все, замість того, щоб намагатися нюхати дистрибутив, вам слід детальніше розглянути конкретний питання, на яке ви насправді повинні відповісти. Зосередьтеся на функціональності, яку ви дивитесь, а не на дистрибутиві, які його надають. Зрештою, нова версія дистрибутива може розвернутися і піти у зворотному напрямку на будь-якій конкретній осі.


3
Існує немає /etc/issueна моєму сервері
Billy Moon

Так. Зверніть увагу, що /etc/issueможуть містити послідовності втечі, такі як \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


0

uname -a

Працює завжди для будь-якого Tux


1
Це повідомляє рядок версії ядра , що може бути дуже помилковим, якщо ваш хост працює з ядром з іншого дистрибутива - чи то на голому металі, так і через інструмент на зразок OpenVZ або VServers.
sarnold

Так, але я гадаю, що в цьому випадку автор Q буде знати що. про ситуацію. "Іноземне" ядро ​​є досить дивним випадком
Ледачий борсук

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

Тос - найкращий метод

cat /etc/*release

Я вказав свій /etcкаталог у запитанні. Як обговорювалося в інших відповідях, це рішення для мене не працює.
Біллі Мун

U спробував випуск ls / etc *; . Це неправильно. Спробуйте випустити ls / etc / *. Це спрацює .am досить впевнений
Unnikrishnan

Я також робив ls в /etc/каталозі, і ви можете бачити, що жоден файл там не закінчуєтьсяrelease
Біллі Мун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.