Как я могу надежно получить имя операционной системы?

69

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

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Который, насколько я могу судить, просто дает ту же информацию, что и /etc/lsb-release. Что если этого файла нет? Кажется, я вспоминаю, что lsb_releaseкоманда является относительно новой, так что если мне нужно получить ОС более старой системы?

В любом случае это lsbозначает, Linux Standard Baseчто я предполагаю, что это не будет работать на Unix-системах. Насколько я знаю, нет никакой возможности получить эту информацию, unameтак как я могу получить ее в системах, которые не используют lsb_release?

Тердон
источник
1
unix.stackexchange.com/questions/6345/… для Linux. uname -sдолжно быть достаточно за пределами Linux (возможно, для BSD).
Мат
Вы проверили facter? facter operatingsystemследует делать то, что вы хотите, на всех системах facterбыло сделано для работы.
Джозеф Р.
@JosephR. выглядит хорошо, но не устанавливается по умолчанию.
Тердон
1
Я вставил facterкод, который получает имя операционной системы на pastebin. Найдите это здесь . Он проверяет много разных файлов, чтобы получить имя надежно.
Джозеф Р.
@JosephR. вау, это много файлов. Я перенесу это на bash, когда у меня будет возможность, это должно быть достаточно портативным. Спасибо!
Тердон

Ответы:

72

lsb_release -a Скорее всего, это будет лучшим вариантом для поиска этой информации и возможности сделать это согласованным образом.

История LSB

Команда lsbin that означает проект Linux Standards Base, являющийся зонтичным проектом, спонсируемым Linux Foundation, для предоставления общих методов выполнения базовых задач в различных дистрибутивах Linux.

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

выдержка из чартера

Рабочая группа LSB имеет своей основной целью решение этих двух проблем. Мы публикуем стандарт, который описывает минимальный набор API, который должен поддерживать дистрибутив, по согласованию с основными поставщиками дистрибутива. Мы также предоставляем тесты и инструменты, которые измеряют поддержку стандарта и позволяют разработчикам приложений ориентироваться на общий набор. Наконец, с помощью нашей работы по тестированию мы стремимся предотвратить ненужное расхождение между дистрибутивами.

Полезные ссылки, связанные с LSB

Критицизмы

Есть ряд проблем с LSB, которые делают его проблематичным для таких дистрибутивов, как Debian. Принудительное использование RPM. Смотрите статью в Википедии, чтобы узнать больше .

Novell

Если вы будете искать, вы, возможно, найдете довольно устаревшую страницу под названием: « Определение лежащего в основе дистрибутива Linux от 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!

Сценарий места для ног

Другой метод, который я видел, - это использовать свой собственный скрипт, аналогичный описанному выше методу 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 --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 
SLM
источник
1
Примечание: только что провел быструю проверку на машинах с AIX и SunOS. Похоже, на них не установлен lsb_release (и в конце концов, это Unix, а не стек Linux). Проблема с gcc в том, что некоторые пользователи теперь начинают использовать clang. Также вы никогда не можете быть уверены, какой gcc был использован для сборки (в системах, с которыми я работаю, есть как минимум несколько версий для каждой). Так что мой голос идет за решение Python, так как оно, по-видимому, теперь установлено везде по умолчанию.
Элмо
@elmo - да, LSB - это стандарт Linux Base, поэтому я не ожидаю, что AIX или SunOS будут иметь его. Мой опыт работы с SunOS составляет более 15 лет, и большинство поставщиков, чье программное обеспечение, с которым я имел дело, обычно предоставляют собственный сценарий оболочки, похожий на те, на которые я ссылался выше. До Solaris 11 Python не был вариантом. И это то, что делает его крепким орешком. Если вы предоставляете программное обеспечение, которое должно работать на Solaris 9, 10, 11, AIX и нескольких дистрибутивах Linux (SUSE, Ubntu и RHEL), что вы делаете? Python не вариант, поэтому у вас остался скрипт оболочки с ручным кодом.
SLM
@elmo - gcc, хотя, вариант, кажется, мне тоже не нравится. Кажется, оно связано со слишком многими проблемами, я демонстрировал это просто как вариант.
СЛМ
@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 совсем не удивительно, если это подход по умолчанию.
Элмо
16

Поскольку вы, вероятно, не сможете установить facterна удаленный сервер, вы можете имитировать то, что он делает, чтобы найти имя ОС. Код Ruby для этого operatingsystemфакта можно найти здесь на pastebin . По сути, он просматривает различные *-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
«Извините, если вы найдете дубликаты в этом списке, я быстро их создал с помощью grep». ... | uniq?
new123456
@ new123456 Верно. Благодарю. Ключевое слово здесь «быстро» :)
Джозеф Р.
Извините, что не принял это, но ответ @ slm слишком полон, чтобы его игнорировать :).
Тердон
3
что насчет / etc / os-release?
Евгений Якимович
1
@ new123456 Технически это должно быть ... | sort -u. uniqнаходит только смежные уникальные элементы.
Парфянский выстрел
9

Если вы pythonустановили (неважно, Python 3 или Python 2), вы можете узнать имя дистрибутива, не изобретая колесо заново :

python -c "import platform;print(platform.linux_distribution()[0])"
heinrich5991
источник
Если вы склонны использовать эту опцию, убедитесь, что ваша ОС поддерживается: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Если вы не можете добавить еще к списку: coderwall.com/p/cwrenq
ОДС
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.кажется, что системный администратор может написать все, что пожелает.
Тердон
2
/etc/issueсовершенно ненадежно. (Я вижу системы в версии XY со /etc/issueзнаменем, в котором говорится, что они были YZ из-за неправильного управления патчами. Он может содержать абсолютно все.)
Мат
Рекомендуется заполнить этот файл. легальные вещи, такие как, кому разрешено войти.
Нильс
Рекомендовано руководящими принципами безопасности и аудиторами. Когда-то в суде был случай, когда хакер ушел без наказания, потому что в / etc / issue был ДОБРО ПОЖАЛОВАТЬ
Nils
На странице руководства @drewbenn написано то, что я цитировал в своем первом комментарии, там нет ничего о необходимости содержать системную информацию. Просто так часто бывает.
Тердон
6

Вы не можете достоверно получить имя дистрибутива из одной команды во всех дистрибутивах. Некоторые доступны через / etc / * - release, а другие доступны через команду 'lsb-release'.

Боз
источник
Спасибо, но это не помощь, когда дело доходит до Unix или любого другого не Linux * nix.
Тердон
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, и печатает конкретное имя операционной системы.

Он работал в

  • CentOS (сентос)
  • RedHat (redhat)
  • Debian (дебиан)
  • Арка (арка)
  • OpenSUSE (OpenSUSE)
  • Fedora (федора)
  • Ubuntu (Debian)
scrutari
источник
Не будет 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)man объясняет, как получить это значение с примерами.

Дауд
источник
Недостатком является то, что это статическая строка, которая не поддерживается автоматически.
Нильс
1

Поскольку не существует распространенного способа сделать это, мы определили строку освобождения с помощью команды snmp exec.

Задача этой команды - распечатать дистрибутив и текущую основную / вспомогательную версию операционной системы.

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

Nils
источник
Кто такие «мы»? А как насчет Unix?
Тердон
@terdon мы наша команда на работе. В Unix вы можете сделать то же самое, если соответствующее расширение скомпилировано в snmpd.
Нильс
Ах, я думал, что вы были частью какой-то группы стандартов :)
terdon
@terdon Вы начинаете разрабатывать стандарты сайтов, когда вам нужно управлять более чем 80 серверами. Мы разработали этот метод, чтобы мы могли отслеживать, устарела ли операционная система (младший или даже большой номер EoL)
Нильс
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
Sammitch
источник
2
не анализировать вывод ls!
heinrich5991
@ heinrich5991 почему бы и нет?
Саммит
Технически, он не анализирует вывод ls. Он лексирует вывод ls. Но да ... Это неправильно, потому что /etc/issueсовершенно ненадежно. Совершенно, совершенно, совершенно ненадежно. Кроме того, ваше предположение, что никто не может поместить файл, не связанный с os, заканчивающийся на «release» или «version», не имеет смысла.
Парфянский выстрел
@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 Sat 14 сентября 05:32:37 EDT 2013 x86_64

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

xpros
источник
Что snpwalk? Где я могу найти его? Кроме того, это просто печатает «Linux», никакой информации о распространении (что я хочу, unameможет дать мне Linux). Это работает на не-Linux ОС? На UNIX говорят, или на BSD или на OSX?
Тердон
snmpwalk - это утилита командной строки Linux. Он не просто печатает «Linux», но также печатает версию ядра, которая действительно единственная вещь, которая вам нужна. Если SNMP настроен на других ваших хостах, будь то UNIX, BSD, OSX, snmpwalk будет работать как стандарт (v1 | v2c | v3) и даже работать на хостах Windows. Смотрите также snmpget или snmpgetnext.
xpros
Звучит хорошо, но не могли бы вы отредактировать свой ответ и объяснить, где мы можем его найти. Например, не в репозиториях Debian. Также, пожалуйста, объясните, что он дает, uname -aа что нет, и как он может сказать мне название дистрибутива, о котором идет речь в этом вопросе. В любом случае, даже если предположить, что он может вернуть эту информацию, поскольку это нестандартная утилита, которую нужно установить, я не уверен, что она будет здесь полезной. Идея состоит в том, чтобы войти в удаленную систему и выяснить ОС (включая дистрибутив, если это Linux).
Тердон
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

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

Для этого уже есть инструмент lsb_release, почему бы вам просто не использовать это?Ну, это очень странный интерфейс: сценарий оболочки, который вы должны вызывать (и, следовательно, порождать асинхронно из вашего кода C), и он не написан для расширения. Это необязательный пакет во многих дистрибутивах, и мы не будем рады вызывать его как часть ранней загрузки, чтобы показать приветственное сообщение. (Во времена загрузки в секунду пользовательского пространства мы действительно не хотим вызывать огромный сценарий оболочки для тривиальности, такой как показ приветственного сообщения). Нам представляется, что инструмент lsb_release является попыткой абстрагирования проверок распространения, где необходима стандартизация проверок распространения. Это просто плохо разработанный интерфейс. По нашему мнению, он используется в качестве интерфейса для определения самой версии LSB, но не для проверки дистрибутива или версии.

анатолий техтоник
источник
Спасибо, но принятый ответ уже рассматривает это в конце цитаты, которая объясняет, что /etc/os-releaseэто станет более стандартным. Однако этот файл не всегда присутствует во всех системах, поэтому принятый ответ дает более портативные альтернативы. Кроме того, я не знаю, почему вы упоминаете код на C, вопрос не в том, чтобы вызывать что-либо из C.
terdon
@terdon Мне просто интересно, что это за системы в 2018 году, где их /etc/os-releaseнет? Я предполагаю, что их пользовательская база несчастна по сравнению с системами, которые lsb_releaseне поставляются по умолчанию. По крайней мере, я не смог использовать ваш принятый ответ на Fedora. Что касается комментариев C, то это не моя systemdссылка , а цитата из ссылки 0pointer.de, которую я предоставил.
анатолий техтоник
Да, я знаю, что это не твое, мне просто интересно, почему ты считаешь, что цитата о коде на C актуальна. И, насколько я знаю, os-releaseэто в основном или исключительно Linux. Кажется, что он определен FreeDesktop.org, так что, возможно, некоторые версии Unix также используют его, но я сомневаюсь, что вы найдете его в большинстве или во встроенных системах или в любой системе без графического интерфейса и т. Д. Наконец, не забывайте, что много мест до сих пор используют очень старые машины из соображений стабильности.
Тердон
Цитата о том, lsb_releaseи вы можете заменить C на Go и получить тот же аргумент. Затраты на запуск lsb_releaseнамного выше с точки зрения безопасности и производительности, чем просто анализ статического файла. Я не верю в очень старые машины, обеспечивающие стабильность. Сердцебиение и друзья должны были забрать их давным-давно, так что просто используйте/etc/os-release
Анатолий techtonik