Як я можу надійно отримати ім’я операційної системи?


69

Скажіть, я ввійшов у віддалену систему, як я можу знати, що він працює? У більшості сучасних Linux (Linuces?) Ви маєте lsb_releaseкоманду:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Наскільки я можу сказати, просто така ж інформація, як і /etc/lsb-release. Що робити, якщо цього файлу немає? Здається, я пам'ятаю, що lsb_releaseкоманда порівняно нова, тому що, якщо мені доведеться отримати ОС старішої системи?

У будь-якому випадку, lsbрозшифровується, Linux Standard Baseтому я припускаю, що він не працюватиме на не-Linux Unices. Наскільки я знаю, немає жодної можливості отримати цю інформацію, unameтак як я можу це отримати в системах, які не використовують lsb_release?


1
unix.stackexchange.com/questions/6345/… для Linux. uname -sмає бути достатньо за межами Linux (очікуйте, можливо, для BSD).
Мат

Ви перевірили facter? facter operatingsystemВи повинні зробити те, що ви хочете, щоб усі системи facterбули створені для роботи.
Джозеф Р.

@JosephR. виглядає добре, але не встановлено за замовчуванням.
terdon

1
Я вставив facterкод, який отримує ім'я операційної системи на пастібін. Знайдіть його тут . Він перевіряє багато різних файлів, щоб надійно отримати ім'я.
Джозеф Р.

@JosephR. Нічого, це багато файлів. Я портую, щоб пограти, коли отримаю можливість, це повинно бути досить портативним. Дякую!
terdon

Відповіді:


72

lsb_release -a швидше за все, це буде найкращим варіантом пошуку цієї інформації та її можливості послідовно виконувати.

Історія ЛСБ

Команда lsbв цій програмі розшифровує проект Linux Standards Base, який є парасольковим проектом, спонсоруваним Фондом Linux, для надання загальних методів для виконання основних видів речей у різних дистрибутивах Linux.

Проект є добровільним, і постачальники можуть брати участь у проекті як просто користувач, а також як фасилітатори різних специфікацій навколо різних модулів, які допомагають сприяти стандартизації в різних дистрибутивах Linux.

витяг із статуту

Основна мета робочої групи LSB - вирішити ці дві проблеми. Ми публікуємо стандарт, який описує мінімальний набір API, який повинен підтримувати дистрибутив, узгоджуючись з основними постачальниками дистрибуції. Ми також надаємо тести та інструменти, які вимірюють підтримку стандарту, і дозволяють розробникам додатків орієнтуватися на загальний набір. Нарешті, завдяки нашій тестовій роботі ми прагнемо не допустити зайвих розбіжностей між розподілами.

Корисні посилання, пов'язані з LSB

Критики

Існує ряд проблем з LSB, які роблять його проблематичним для таких дистрибутивів, як Debian. Примусове використання RPM є одним. Докладніше з цього питання див . У статті Вікіпедії .

Novell

Якщо ви шукаєте, можливо, ви натрапите на досить застарілу сторінку з назвою: Виявлення базового Linux Distro від Novell. Це одне з небагатьох місць, де я бачив фактичний список, який показує кілька основних дистрибутивів, і як ви можете виявити, що лежить в основі одного ви використовуєте.

витяг

Novell SUSE         /etc/SUSE-release
Red Hat             /etc/redhat-release, /etc/redhat_version
Fedora              /etc/fedora-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
UnitedLinux         /etc/UnitedLinux-release
ubuntu              /etc/lsb-release

Ця ж сторінка також містить зручний сценарій, який намагається зашифрувати вищезазначене за допомогою лише unameкоманд ванілі та наявність одного з вищезазначених файлів.

ПРИМІТКА: Цей список датований, але ви можете легко скинути датовані дистрибутиви, такі як Mandrake, зі списку та замінити їх альтернативами. Цей тип сценарію може бути одним із підходів, якщо ви намагаєтесь підтримувати велику кількість варіантів Solaris & Linux.

Linux Mafia

Для більшого пошуку з'явиться наступна сторінка, що підтримується на Linuxmafia.com, під назвою: / etc / release еквіваленти для різних дистрибутивів Linux (та інших Unix) . Це, мабуть, найвичерпніший список на сьогоднішній день, який я бачив. Ви можете зашифрувати цей список за допомогою оператора case / switch і включити його до складу вашого програмного забезпечення.

Насправді внизу цієї сторінки є сценарій, який робить саме це. Таким чином, ви можете просто завантажити та використовувати скрипт як сторонню сторону вашого дистрибутиву.

сценарій

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

ПРИМІТКА: Цей сценарій повинен виглядати звично, це сучасна версія версії Novell!

Сценарій Legroom

Ще один метод, який я бачив, - це розгорнути свій власний сценарій, подібний до вищевказаного методу Novell, але натомість використовувати LSB. У цій статті під назвою: Загальний метод визначення імені розповсюдження Linux (або UNIX) показаний один такий метод.

# Determine OS platform
UNAME=$(uname | tr "[:upper:]" "[:lower:]")
# If Linux, try to determine specific distribution
if [ "$UNAME" == "linux" ]; then
    # If available, use LSB to identify distribution
    if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
        export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
    # Otherwise, use release info file
    else
        export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
    fi
fi
# For everything else (or if above failed), just use generic identifier
[ "$DISTRO" == "" ] && export DISTRO=$UNAME
unset UNAME

Цей фрагмент коду може бути включений в систему /etc/bashrcабо якийсь такий файл, який потім встановить змінну середовища $DISTRO.

gcc

Вірити чи не іншим методом є використання gcc. Якщо ви gcc --versionзапитаєте команду, ви отримаєте дистрибутив, для якого був створений gcc, незмінно такий же, як у системі, на якій він працює.

Fedora 14

$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.

CentOS 5.x

$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.

CentOS 6.x

$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.

Ubuntu 12.04

$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.

TL; DR;

Отже, який я повинен використовувати? Я б схильний працювати з lsb_release -aбудь-якими дистрибутивами Linux, якими я часто користувався (RedHat, Debian, Ubuntu тощо). У ситуаціях, коли ти підтримуєш системи, які не надають, lsb_releaseя би розгорнув свою частину дистрибутиву програмного забезпечення, яке я надаю, подібно до одного з вищезазначених сценаріїв.

ОНОВЛЕННЯ №1: Наступні дії з SuSE

Розмовляючи з @Nils в коментарях нижче, було встановлено, що з будь-якої причини SLES11, як видається, не дозволяє встановити LSB за замовчуванням. Це була лише необов'язкова установка, яка здавалася лічильником для пакету, що забезпечує цей тип ключових функцій.

Тож я скористався можливістю зв’язатися з кимось із проекту OpenSuSE, щоб зрозуміти, чому саме.

уривок електронної пошти

Hi Rob,

I hope you don't mind me contacting you directly but I found your info here: 
https://en.opensuse.org/User:Rjschwei. I participate on one of the StackExchange 
sites, Unix & Linux and a question recently came up regarding the best option 
for determining the underlying OS.

http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name/92218?noredirect=1#comment140840_92218

In my answer I suggested using lsb_release, but one of the other users mentioned 
that this command wasn't installed as part of SLES11 which kind of surprised me. 
Anyway we were looking for some way to confirm whether this was intentionally 
dropped from SLES or it was accidental.

Would you know how we could go about confirming this one way or another?

Thanks for reading this, appreciate any help and/or guidance on this.

-Sam Mingolelli
http://unix.stackexchange.com/users/7453/slm

Ось відповідь Роб

Hi,

On 10/01/2013 09:31 AM, Sam Mingo wrote:
- show quoted text -

lsb_release was not dropped in SLES 11. SLES 11 is LSB certified. However, it 
is not installed by default, which is consistent with pretty much every other
distribution. The lsb_release command is part of the lsb-release package.

At present almost every distribution has an entry in /etc such as 
/etc/SuSE-release for SLES and openSUSE. Since this is difficult for ISVs and 
others there is a standardization effort going on driven by the convergence to 
systemd. The standard location for distribution information in the future will 
be /etc/os-release, although Ubuntu will probably do something different.

HTH,    
Robert

--  Robert Schweikert                           MAY THE SOURCE BE WITH YOU    
SUSE-IBM Software Integration Center                   LINUX    
Tech Lead    
Public Cloud Architect 

1
Примітка. Щойно зробили швидку перевірку на машинах з AIX та SunOS. У них, здається, не встановлено lsb_release (і зрештою, це Unix, а не стек Linux). Проблема з gcc полягає в тому, що деякі ppl зараз починають використовувати clang. Також ви ніколи не можете бути впевнені, який gcc використовувався для побудови (у системах, з якими я працюю, принаймні мало версій у кожній). Тож мій голос іде за рішення Python, оскільки, здається, він встановлений скрізь скрізь за замовчуванням.
elmo

@elmo - так, LSB - це стандартна база Linux, тому я не сподівався б на її створення AIX або SunOS. Мій досвід роботи з SunOS становить 15+ років, і більшість постачальників, з чиїм програмним забезпеченням я мав справу, зазвичай надають там власний скрипт оболонки, аналогічний тому, про який я посилався вище. До Соляріса 11 Python не був варіантом. І саме це утруднює розтріскування горіха. Якщо ви надаєте програмне забезпечення, яке потрібно запускати на Solaris 9, 10, 11, AIX та пару дистрибутивів Linux (SUSE, Ubntu та RHEL), що ви робите? Python - це не варіант, тому вам залишається сценарій оболонки, кодований рукою.
slm

@elmo - gcc, однак, варіант, здається, мені теж не подобається. Здається, що це занадто багато проблем, я демонстрував це лише як варіант.
slm

@elmo - подивіться код за цією функцією, hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Великий сюрприз - це використання LSB!
slm

@slm: У мене є доступ до машини з SunOS 5.10 (яка, я вважаю, у вашому списку 10 - я не знайомий з номерами версій / умовами Sun) і у неї є Python. У мене є доступ до машини з AIX 7 і у неї є Python. Машини Linux, очевидно, теж є. Тож все ще Python виглядає як найбільш портативний вибір. Щодо Sun нижче 10, я не впевнений, чому це не дозволило б встановити Python (правда, поточної установки не вистачає, тобто ncurses та ctypes, так хто знає). Що стосується Python, що використовує LSB, то для Linux це зовсім не дивно, якщо це підхід за замовчуванням.
elmo

16

Оскільки ви, ймовірно, не зможете встановити facterна віддалений сервер, ви можете імітувати те, що він робить, щоб знайти ім’я ОС. Код Рубі за цим operatingsystemфактом можна знайти тут на пастібіні . В основному, *-releaseдля визначення назви ОС розглядаються різні файли та інші.

Деякі файли, на які він дивиться:

/etc/debian_version
/etc/gentoo-release
/etc/fedora-release
/etc/mandriva-release
/etc/mandrake-release
/etc/meego-release
/etc/arch-release
/etc/oracle-release
/etc/enterprise-release
/etc/ovs-release
/etc/vmware-release
/etc/redhat-release
/etc/SuSE-release
/etc/bluewhite64-version
/etc/slamd64-version
/etc/slackware-version
/etc/alpine-release
/etc/system-release
/etc/centos-release

Мені дуже шкода , якщо ви знайти дублікати в цьому списку, я зробив його швидко з grep. Переносити це на сценарій оболонки POSIX слід досить просто (хоч і трохи нудно).


5
"Вибачте, якщо ви знайдете дублікати в цьому списку, я швидко створив це з грепом". ... | uniq?
new123456

@ new123456 Правильно. Дякую. Ключове слово тут "швидко" :)
Джозеф Р.

Вибачте за неприйняття цього, але відповідь @ slm є занадто вичерпною, щоб ігнорувати :).
terdon

3
як щодо / etc / os-release?
Яуген Якимович

1
@ new123456 Технічно це повинно бути ... | sort -u. uniqзнаходить лише суміжні унікальні елементи.
Парфянський розстріл

9

Якщо ви pythonвстановили (неважливо, Python 3 чи Python 2), ви можете дізнатися ім'я розповсюдження, не винаходивши колесо :

python -c "import platform;print(platform.linux_distribution()[0])"

Якщо ви спокусилися скористатися цією опцією, переконайтеся, що ваша ОС підтримується: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Якщо ні, ви можете додати більше до списку: coderwall.com/p/cwrenq
slm

1
Це не працюватиме з давніми дистрибутивами Linux. Наприклад: SuSE 7.0 мав Python 1.5.2, а модуль платформи був доданий не до появи Python 2.3 у 2003 році ;-)
pefu

6

/etc/issueповинна містити інформацію про випуск. Я впевнений, що бачив це в системах Solaris. Ось файл із сучасної системи Debian:

$ cat /etc/issue
Debian GNU/Linux 7 \n \l

$ 

/ etc / issue також згадується у FHS (що стосується не лише систем Linux), хоча є "необов'язковим".


Ах, це гарна пропозиція, +1. Це може не завжди спрацювати, хоча The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.здається, що сисадміну потрібно писати все, що він / вона забажає.
terdon

2
/etc/issueє абсолютно ненадійним. (Я бачу системи у версії XY з /etc/issueбанером, який говорить про те, що YZ слід керувати поганим управлінням патчем. Він може містити абсолютно все.)
Мат.

Рекомендується заповнити цей файл. легальні речі, такі як, кому дозволено входити в систему.
Нілс

Рекомендовано рекомендаціями щодо безпеки та аудиторами. Колись був закон, коли хакер пішов без покарання, тому що в / etc / issue був ВІТАЙТЕ
Nils

@drewbenn сторінка man говорить про те, що я цитував у своєму першому коментарі, нічого там немає про її необхідність містити системну інформацію. Це просто часто трапляється.
terdon

6

Ви не можете надійно отримати ім'я дистрибутива з однієї команди по всіх дистрибутивах. Деякі доступні через / etc / * - release, а інші доступні за допомогою команди 'lsb-release'.


Дякую, але жодна з них не допомагає, якщо мова йде про Unix або будь-який інший не-Linux * nix.
terdon

3

Я використовував цю команду оболонки, щоб отримати рядок із зазначенням розподілу Linux:

for f in $(find /etc -type f -maxdepth 1 \( ! -wholename /etc/os-release ! -wholename /etc/lsb-release -wholename /etc/\*release -o -wholename /etc/\*version \) 2> /dev/null); do echo ${f:5:${#f}-13}; done;

ця команда заснована на відповідях Джозефа Р. та слм.

Він просто шукає такі файли, як / etc / {osname} -release або / etc / {osname} _version та друкує певне ім’я os.

Це працювало в Росії

  • CentOS (цент)
  • RedHat (redhat)
  • Debian (debian)
  • Арка (арка)
  • OpenSUSE (OpenSUSE)
  • Fedora (Fedora)
  • Ubuntu (debian)

Не вдалося б for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; doneоднаково добре працювати на всіх них? Я не розумію, чому ви спочатку findвсі файли в /etc.
тердон

Дякую за відгук, terdon, але ваша команда дає 0 рядків принаймні Cent OS та Fedora
scrutari

1
0pointer.de/blog/projects/os-release.html для поширених запитань
weberjn

1

SNMP - досить всюдисущий протокол, який можна знайти у багатьох різних видах дистрибутивів GNU / Linux та UNIX-систем.

system.sysDescr.0Об'єкт в SNMPv2-MIB може допомогти вам дізнатися, які ОС ви зв'язуєтеся, при умови , що є демон SNMP працює в цільовій системі:

Опис

Текстовий опис сутності. Це значення повинно містити повне ім'я та ідентифікацію версії типу апаратного забезпечення системи, операційної системи програмного забезпечення та мережевого програмного забезпечення.

Статус: поточний

Доступ: лише для читання

На цій сторінці snmpget(1)пояснюється, як отримати це значення за допомогою прикладів.


Недолік полягає в тому, що це статична рядок, яка не підтримується автоматично.
Нілс

1

Оскільки для цього немає загального способу, ми визначили рядок випуску за допомогою команди snmp exec.

Завдання цієї команди - роздрукувати distro та поточну основну / другорядну версію os.

На RH і клони ми розбираємо / etc / redhat-release, на SuSe SuSe-release ...


Хто "ми"? А як щодо Unix?
terdon

@terdon - це наша команда на роботі. У Unix ви можете зробити те ж саме, якщо відповідне розширення компілюється в snmpd.
Нілс

Ах, я думав, ти був частиною якоїсь групи стандартів :)
terdon

@terdon Ви починаєте розробляти стандарти сайтів, коли вам потрібно керувати більш ніж 80 серверами. Ми розробили цей метод, щоб ми могли стежити за тим, як ос є застарілим (EoL другорядне або навіть основне число)
Nils

1

З того, що мені вдалося отримати з цієї теми, ви повинні мати можливість отримувати інформацію з чортової поблизу будь-якої системи, використовуючи:

if which lsb_release &>> /dev/null; then
    lsb_release -a
elif [ -r /etc/issue ]; then
    cat /etc/issue
else
    ls /etc/ | grep -e '[_-]release$' -e '[_-]version$' | xargs -I % -n 1 cat /etc/%
fi

2
не розбирайте висновок ls!
heinrich5991

@ heinrich5991 чому б і ні?
Саммітч

Технічно він не розбирає вихід ls. Він лексикує вихід ls. Але так ... Це неправильно, оскільки /etc/issueє абсолютно ненадійним. Повністю, цілком, абсолютно ненадійно. Крім того, ваше припущення, що ніхто не може поставити файл, не пов’язаний з ОС, що закінчується на "випуск" або "версія", нерозумно.
Парфянський розстріл

@ParthianShot Отже, головним чином, ви хочете поскаржитися на другий та третій рівні резервної копії у випадку, якщо більш надійні варіанти недоступні?
Саммітч

@Sammitch more reliable optionsНу, для одного, є лише один варіант. Тож навіть якщо припустити, що я погодився з вашим припущенням, що це надійніше (чого я не знаю), не давайте починати плюралізувати речі. По-друге, якби хтось реально використав ваше рішення, і воно повністю провалило половину часу, його не втішило б те, що воно вийшло з ладу в "іншому випадку". Жодна з моїх систем не lsbвстановлена ​​за замовчуванням.
Парфянський розстріл

1

Якщо ситуація викликала це, ви можете дізнатися віддалено, використовуючи snmpwalk [або протокол SNMP взагалі]. Приклад нижче:

snmpwalk -Os -c <snmp community string> -v1 <hostname> sysDescr.0

OUPUT: sysDescr.0 = STRING: Linux example.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP Сб 14 вересня 05:32:37 EDT 2013 x86_64

Ключовим фактором надійності є те, чи правильно налаштовано SNMP у вашому оточенні, чи всі хости мають snmp, що працює з належним налаштуванням рядків спільноти.


Що snpwalk? Де я можу його знайти? Крім того, що просто друкує "Linux", ніяка інформація про розповсюдження (що я хочу, не unameможе мені дати Linux). Чи працює це на ОС, що не є Linux? У UNIX кажуть, або BSD чи OSX?
terdon

snmpwalk - це утиліта командного рядка Linux. Він не просто друкує "Linux", але також друкує версію ядра, що справді єдине, що вам потрібно. Якщо SNMP налаштовано на інших ваших хостах, будь то UNIX, BSD, OSX, snmpwalk працюватиме як стандарт (v1 | v2c | v3), і він навіть працюватиме над водою на хостах Windows. Дивіться також snmpget або snmpgetnext.
xpros

Звучить добре, але ви можете, будь ласка, відредагуйте свою відповідь та поясніть, де ми можемо її знайти. Це, наприклад, не репортаж Debian. Також, будь ласка, поясніть, що це дає, що uname -aне дає, і як він може сказати мені назву дистрибуції, про що йдеться у цьому питанні. У будь-якому випадку, навіть припускаючи, що вона може повернути цю інформацію, бачачи, що це нестандартна утиліта і її потрібно встановити, я не впевнений, що це було б корисно тут. Ідея полягає в тому, щоб увійти до віддаленої системи та дізнатися ОС (включаючи дистрибутив, якщо це Linux).
terdon

it also prints the kernel version which is really the only thing you needАле ... в цьому і полягає вся суть цього питання. Якщо це дійсно все, що вам потрібно, ви можете просто скористатися uname -a. Ядро є важливою частиною операційної системи, але це не вся операційна система. Макет файлової системи та утиліти користувача (наприклад, менеджер пакунків) мають значення.
Парфянський розстріл

1

Використання /etc/os-release:

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.10 (Cosmic Cuttlefish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.10"
VERSION_ID="18.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=cosmic
UBUNTU_CODENAME=cosmic

Причини добре пояснюються у поширених запитаннях за посиланням http://0pointer.de/blog/projects/os-release.html, що безоплатно надано @weberjn у цьому коментарі . Я лише перелічу тут один аргумент проти використання того, lsb_releaseщо поки що є найбільш популярною відповіддю 2013 року.

Для цього вже є інструмент lsb_release, чому б вам просто не скористатися цим?Ну, це дуже дивний інтерфейс: сценарій оболонки, який ви повинні викликати (а значить, ініціювати асинхронно зі свого коду С), і він не може бути розширений. Це необов'язковий пакет у багатьох дистрибутивах, і нічого, що ми би раді були використати як частину раннього завантаження, щоб показати вітальне повідомлення. (У часи завантаження підсекундної області користувальницької області ми дійсно не хочемо використовувати величезний скрипт оболонки для такої дрібниці, як показ вітального повідомлення). Інструмент lsb_release нам видається спробою абстрагувати перевірки розповсюдження, де необхідна стандартизація перевірок розподілу. Це просто погано розроблений інтерфейс. На нашу думку, він використовує як інтерфейс для визначення самої версії LSB, але не для перевірки розповсюдження чи версії.


Дякую, але прийнята відповідь вже вирішує це в цитаті, зрештою, де пояснюється, що /etc/os-releaseстане більш стандартним. Однак цей файл не завжди є у всіх системах, тому прийнята відповідь дає більш портативні альтернативи. Крім того, я не знаю, чому ви
згадуєте

@terdon Мені просто цікаво, які системи у 2018 році там, де /etc/os-releaseїх немає? Я здогадуюсь, що їхня база користувачів жалюгідна порівняно із системами, де lsb_releaseне постачається за замовчуванням. Принаймні, я не міг використати вашу прийняту відповідь у Fedora. Що стосується коментаря C, то це не моя, а цитата із systemdпосилання 0pointer.de, яку я надав.
anatoly techtonik

Так, я знаю, що це не ваше, мені було просто цікаво, чому ви вважаєте, що цитата про код C є актуальною. І наскільки я знаю, os-releaseце в основному або виключно річ Linux. Здається, це визначено FreeDesktop.org, тому, можливо, деякі аромати Unix також використовують його, але я сумніваюся, ви знайдете його в більшості або вбудованих системах, або будь-якій системі, що не є GUI і т.д. Нарешті, не забувайте, що багато місць досі використовують дуже старі машини з міркувань стабільності.
тердон

Цитата приблизно, lsb_releaseі ви можете замінити C на Go і отримати той самий аргумент. Витрати на запуск lsb_releaseнабагато вищі з точки зору безпеки та продуктивності, ніж просто розбір статичного файлу. Я не вірю в дуже старі машини, що забезпечують стабільність. Сердечні та друзі повинні були забрати їх давно, тому просто використовуйте/etc/os-release
anatoly techtonik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.