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

Как сказано в комментарии, существует более чистый способ сделать это: wodim -prcap который дает точно, в чем Вы нуждаетесь.

Device seems to be: Generic mmc2 DVD-R/DVD-RW.

Кроме того, dmesg | grep RW, в моем случае (диск читателя DVD-RW/BD) это возвращает что-то как

[    2.399074] ata2.00: ATAPI: HL-DT-ST DVDRW/BDROM CT40N, A101, max UDMA/133
[    2.409247] scsi 1:0:0:0: CD-ROM            HL-DT-ST DVDRWBD CT40N    A101 PQ: 0 ANSI: 5

и wodim dev=/dev/cdrom -scanbus:

scsibus1:
        1,0,0   100) 'HL-DT-ST' 'DVDRWBD CT40N   ' 'A101' Removable CD-ROM
70
25.09.2013, 01:41
11 ответов

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

История LSB

lsb в той команде обозначает Основу Стандартов Linux проекта, которая является проектом зонтика, спонсируемым Основой Linux для обеспечения общих методов для того, чтобы сделать основные виды вещей на различных дистрибутивах Linux.

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

выборка из чартера

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

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

Критические замечания

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

Novell

Если Вы будете искать, то Вы возможно столкнетесь со справедливо датировано выглядящей названной страницей: Обнаружение Базового Дистрибутива Linux от Novell. Это - одно из нескольких мест I "ve замеченный фактический список, который показывает несколько из главных дистрибутивов и как можно обнаружить, какое лежание в основе того Вы используете.

выборка

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 команды и присутствие одного из вышеупомянутых файлов.

Примечание: Этот список датирован, но Вы могли легко отбросить датированные дистрибутивы, такие как Мандрагора из списка и заменить их альтернативами. Этот тип сценария мог бы быть одним подходом, при попытке поддерживать большой ряд вариантов Solaris & Linux.

Мафия Linux

Больше поиска поднимет следующую страницу, сохраняемую на Linuxmafia.com, названном: эквиваленты/etc/release для различного Linux (и другой Unix) дистрибутивы. Это - вероятно, самый исчерпывающий список до настоящего времени, что я видел. Вы могли шифровать этот список со случаем/оператором переключения и включать его как часть Вашего распределения программного обеспечения.

На самом деле существует сценарий у основания той страницы, которая делает точно это. Таким образом, Вы могли просто загрузить и использовать сценарий в качестве третьей стороны к Вашему распределению программного обеспечения.

сценарий

#!/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. Если Вы запрашиваете команду gcc --version Вы получите дистрибутив, для которого был создан gcc, который является invaribly то же как система, на которой это работает.

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

Вот ответ Rob

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 
73
27.01.2020, 19:31
  • 1
    Отметьте: Просто сделал быструю проверку на машинах с AIX и SunOS. У них, кажется, нет установленного lsb_release (и в конце концов, это - Unix не стек Linux). Проблема с gcc состоит в том, что некоторые люди теперь начинают использовать лязг. Также Вы никогда не можете быть уверены, который gcc использовался для создания (в системах, с которыми я работаю существует по крайней мере немного версий на каждом). Таким образом, мой голос переходит к решению Python, поскольку это, кажется, установлено теперь везде по умолчанию. –  elmo 25.09.2013, 12:16
  • 2
    @elmo - да LSB является Основой Стандарта Linux, таким образом, я не ожидал бы, что или AIX или SunOS будут иметь его. Мой опыт с SunOS равняется 15 + годы, и большинство поставщиков, с программным обеспечением которых я имел дело, будет обычно предоставлять там собственный сценарий оболочки, подобный тем, я сослался выше. До Соляриса 11, Python не был опцией. И это - то, что делает это трудной гайкой для взламывания. Если Вы предоставляете программное обеспечение, которое должно работать на Солярисе 9, 10, 11, AIX и несколько дистрибутивов Linux (SUSE, Ubntu и RHEL), что Вы делаете? Python не является опцией, таким образом, Вас оставляют с кодированным сценарием оболочки руки. –  slm♦ 25.09.2013, 12:29
  • 3
    @elmo - gcc, хотя, опция, кажется, не что обращение ко мне также. Это кажется выделанным со слишком многими проблемами, я демонстрировал это просто как опцию. –  slm♦ 25.09.2013, 12:31
  • 4
    @elmo - смотрят на код позади той функции, hg.python.org/cpython/file/2.7/Lib/platform.py#l259. Большое удивление это использует LSB! –  slm♦ 25.09.2013, 12:34
  • 5
    @slm: у Меня есть доступ к машине с SunOS 5.10 (который я принимаю, 10 в Вашем списке - я не настолько знаком с числами/конвенциями версии Sun), и это действительно имеет Python. У меня есть доступ к машине с AIX 7, и это действительно имеет Python. Машины Linux, очевидно, имеют его также. Таким образом, все еще Python похож на большую часть портативного выбора. Что касается Sun ниже 10 я не уверен, почему он не позволил бы Python быть установленным (по общему признанию текущей установке недостает т.е. ncurses и ctypes, поэтому кто знает). Что касается Python с помощью LSB не удивительно вообще для Linux, если это - подход по умолчанию. –  elmo 26.09.2013, 13:49

Так как Вы, вероятно, не сможете установить 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.

16
27.01.2020, 19:31
  • 1
    , "я сожалею, если Вы находите дубликаты в этом списке, я произвел его быстро с grep". ... | uniq? –  new123456 25.09.2013, 02:12
  • 2
    @new123456.Спасибо. Ключевое слово здесь является "быстро" :) –  Joseph R. 25.09.2013, 02:26
  • 3
    Извините за непринятие ответа этого но @slm является просто слишком всесторонним для игнорирования :). –  terdon♦ 25.09.2013, 04:36
  • 4
    что относительно/etc/os-release? –  Yauhen Yakimovich 24.07.2014, 18:57
  • 5
    @new123456 Технически, который должен быть ... | sort -u. uniq только находит смежные уникальные элементы. –  Parthian Shot 18.02.2016, 20:42

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

python -c "import platform;print(platform.linux_distribution()[0])"
9
27.01.2020, 19:31
  • 1
    Если Вы испытываете желание использовать эту опцию, удостоверяются, что Ваша ОС поддерживается: hg.python.org/cpython/file/2.7/Lib/platform.py#l259. Если не можно добавить больше к списку: coderwall.com/p/cwrenq –  slm♦ 25.09.2013, 12:37
  • 2
    Это не будет работать с древними дистрибутивами Linux. Например: SuSE 7.0 имел Python 1.5.2, и модуль платформы был добавлен не перед появлением Python 2.3 в 2003 ;-) –  pefu 27.10.2015, 15:56

/etc/issue должен содержать информацию о выпуске. Я вполне уверен, что видел его в системах Соляриса. Вот файл от современной системы Debian:

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

$ 

/etc/issue также упоминается в FHS (который не является только для систем Linux), хотя это является "дополнительным".

6
27.01.2020, 19:31
  • 1
    . Если simply does not apply то, что, оказывается, наполняет после кроме директивы, затем возможно, я предполагал, что неявное "значение по умолчанию отклоняет". Также следующий пункт от man 5 hosts_access повторяет Ваш ответ. EXCEPT Intended use is of the form: ‘list_1 EXCEPT list_2´; this construct matches anything that matches list_1 unless it matches list_2. ---------121 А-ч--------128465----, это - хорошее предложение, +1. Это не могло бы всегда работать хотя The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt. Это, кажется, до системного администратора для записи независимо от того, что он требует. –  terdon♦ 24.09.2013, 21:49
  • 2
    /etc/issue абсолютно ненадежно. (Я имею, посмотрите системы в версии X.Y с /etc/issue баннер говоря они были Y.Z после плохого управления исправлениями. Это может содержать абсолютно что-либо.) –  Mat 24.09.2013, 21:52
  • 3
    Рекомендуется заполнить тот файл. легальный материал как то, кому разрешают войти в систему. –  Nils 24.09.2013, 22:06
  • 4
    Рекомендуемый инструкциями по безопасности и аудиторами. Был однажды случай по закону, куда хакер ушел без наказания, потому что было ПРИВЕТСТВИЕ в/etc/issue –  Nils 24.09.2013, 22:36
  • 5
    @drewbenn стандартов, в странице справочника говорится, что я заключил в кавычки в своем первом комментарии, нет ничего там о его необходимости содержать информацию о системе. Это просто часто делает. –  terdon♦ 24.09.2013, 22:42

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

6
27.01.2020, 19:31
  • 1
    Спасибо, но ни один не справка когда дело доходит до Unix, или любой другой не-Linux *отклоняют. –  terdon♦ 24.09.2013, 22:19

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

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

Описание

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

Состояние: текущий

Доступ:только для чтения

snmpget(1) страница справочника объясняет, как получить это значение с примерами.

1
27.01.2020, 19:31
  • 1
    состоит в том, что это - статическая строка, которая автоматически не сохраняется. –  Nils 24.09.2013, 22:17

С тех пор нет никакого распространенного способа сделать так, мы определили строку выпуска через snmp исполнительную команду.

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

На RH и клонах мы анализируем/etc/redhat-release на выпуске SuSe SuSe...

1
27.01.2020, 19:31
  • 1
    Кто 'мы'? Как насчет Unix? недостаток –  terdon♦ 24.09.2013, 22:15
  • 2
    @terdon мы - наша команда на работе. На Unix можно сделать то же, если соответствующее расширение компилируется в snmpd. А-ч –  Nils 24.09.2013, 22:39
  • 3
    , я думал, что Вы были частью некоторой группы :) –  terdon♦ 24.09.2013, 22:42
  • 4
    @terdon Вы начинаете разрабатывать стандарты сайта, когда необходимо управлять больше чем 80 серверами. Мы разработали этот метод, таким образом, мы могли контролировать, устарела ли OS (EOL незначительное или даже главное число) –  Nils 24.09.2013, 22:50

Из того, что мне удалось подобрать из этого потока, необходимо смочь получить информацию от проклято-близкого любое системное использование:

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
1
27.01.2020, 19:31
  • 1
    не анализирует вывод ls! Право –  heinrich5991 25.09.2013, 02:17
  • 2
    @heinrich5991 почему нет? –  Sammitch 25.09.2013, 02:31
  • 3
    Технически, он не анализирует вывод ls. Он - lexing вывод ls. Но да... Это неправильно потому что /etc/issue абсолютно ненадежно. Полностью, полностью, полностью ненадежный. Кроме того, Ваше предположение, что никто не мог бы поместить non-os-related файл, заканчивающийся в 'выпуск' или 'версию', неблагоразумно. –  Parthian Shot 18.02.2016, 20:50
  • 4
    @ParthianShot Так главным образом, Вы хотите жаловаться на вторые и третьи уровни нейтрализации в случае, что более надежные опции не доступны? –  Sammitch 19.02.2016, 02:58
  • 5
    @Sammitch more reliable options Ну, с одной стороны, существует только одна опция. Таким образом, так принимая я согласился с Вашим предположением, что это более надежно (который я не делаю), давайте не запускать pluralizing вещи. Во-вторых, если бы кто-то на самом деле использовал Ваше решение, и оно крайне привело половину к сбою времени, то к ним не подключилось бы с консоли то, что оно еще перестало работать в "если". Ни одна из моих систем не имеет lsb установленный по умолчанию. –  Parthian Shot 19.02.2016, 16:09
[114567] Я использовал эту команду оболочки, чтобы получить строку, указывающую на распространение Linux:

эта команда основана на ответах Joseph R. и slm.

enter image description here

Она просто ищет файлы типа /etc/{osname}-release или /etc/{osname}_version и печатает конкретное имя os.


Он работал в

CentOS (centos)[1297]RedHat (redhat)[1298]Debian (debian)[1299]Arch (arch)[12100]OpenSUSE (OpenSUSE)[12101]Fedora (fedora)[12102]Ubuntu (debian)[12103]

3
27.01.2020, 19:31

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

1
27.01.2020, 19:31

Используйте/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 года.

There's already the lsb_release tool for this, why don't you just use that? Well, it's a very strange interface: a shell script you have to invoke (and hence spawn asynchronously from your C code), and it's not written to be extensible. It's an optional package in many distributions, and nothing we'd be happy to invoke as part of early boot in order to show a welcome message. (In times with sub-second userspace boot times we really don't want to invoke a huge shell script for a triviality like showing the welcome message). The lsb_release tool to us appears to be an attempt of abstracting distribution checks, where standardization of distribution checks is needed. It's simply a badly designed interface. In our opinion, it has its use as an interface to determine the LSB version itself, but not for checking the distribution or version.

1
27.01.2020, 19:31

Теги

Похожие вопросы