Как сказано в комментарии, существует более чистый способ сделать это: 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
lsb_release -a
вероятно, будет Вашим наилучшим вариантом для обнаружения этой информации и способности сделать так последовательным способом.
lsb
в той команде обозначает Основу Стандартов Linux проекта, которая является проектом зонтика, спонсируемым Основой Linux для обеспечения общих методов для того, чтобы сделать основные виды вещей на различных дистрибутивах Linux.
Проект доброволен, и поставщики могут участвовать в рамках проекта так же просто пользователь и также как помощники различных спецификаций вокруг различных модулей, которые помогают управлять стандартизацией в различных дистрибутивах Linux.
выборка из чартера
Рабочая группа LSB имеет, как ее базовая цель, для обращения к этим двум проблемам. Мы публикуем стандарт, который описывает минимальный набор API, которые распределение должно поддерживать, после консультаций с крупными поставщиками распределения. Мы также обеспечиваем тесты и инструменты, которые измеряют поддержку стандарта и позволяют разработчикам приложений быть нацеленными на единый набор. Наконец, посредством нашей работы тестирования, мы стремимся предотвратить ненужное расхождение между дистрибутивами.
Существует много проблем с LSB, которые делают его проблематичным для дистрибутивов, таких как Debian. Принудительное использование об/мин, являющегося один. См. статью Wikipedia для больше по вопросу.
Если Вы будете искать, то Вы возможно столкнетесь со справедливо датировано выглядящей названной страницей: Обнаружение Базового Дистрибутива 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.
Больше поиска поднимет следующую страницу, сохраняемую на 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 --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.
Таким образом, какой я должен использовать? Я был бы склонен идти с lsb_release -a
для любых дистрибутивов Linux, которые я часто посещал бы (Redhat, Debian, Ubuntu, и т.д.). Для ситуаций, где Вы поддерживаете системы, которые не обеспечивают lsb_release
Я прокрутил бы свое собственное как часть распределения программного обеспечения, которое я предоставляю, подобный одному из вышеупомянутых сценариев.
В разговоре с @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
Так как Вы, вероятно, не сможете установить 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.
... | uniq
?
– new123456
25.09.2013, 02:12
... | sort -u
. uniq
только находит смежные уникальные элементы.
– Parthian Shot
18.02.2016, 20:42
В случае, если Вы имеете python
установленный (не имеет значения или Python 3 или Python 2), можно узнать имя распределения без изобретения велосипед:
python -c "import platform;print(platform.linux_distribution()[0])"
/etc/issue
должен содержать информацию о выпуске. Я вполне уверен, что видел его в системах Соляриса. Вот файл от современной системы Debian:
$ cat /etc/issue
Debian GNU/Linux 7 \n \l
$
/etc/issue также упоминается в FHS (который не является только для систем Linux), хотя это является "дополнительным".
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
/etc/issue
абсолютно ненадежно. (Я имею, посмотрите системы в версии X.Y с /etc/issue
баннер говоря они были Y.Z после плохого управления исправлениями. Это может содержать абсолютно что-либо.)
– Mat
24.09.2013, 21:52
Вы не можете надежно получить имя дистрибутива от единственной команды через все дистрибутивы. Некоторые доступны через / и т.д. / *-release, и другие доступны через команду 'lsb-выпуска'.
SNMP является достаточно повсеместным протоколом, чтобы быть найденным во многих различных видах систем UNIX и GNU/дистрибутивов Linux.
system.sysDescr.0
объект в SNMPv2-MIB может помочь Вам узнать, с которым ОС Вы связываетесь, если существует демон SNMP, работающий в целевой системе:
Описание
Текстовое описание объекта. Это значение должно включать полное имя и идентификацию версии типа оборудования системы, операционной системы программного обеспечения и сетевого программного обеспечения.
Состояние: текущий
Доступ:только для чтения
snmpget(1)
страница справочника объясняет, как получить это значение с примерами.
С тех пор нет никакого распространенного способа сделать так, мы определили строку выпуска через snmp исполнительную команду.
Задача той команды состоит в том, чтобы распечатать дистрибутив и текущую главную / вспомогательную версию OS.
На RH и клонах мы анализируем/etc/redhat-release на выпуске SuSe SuSe...
Из того, что мне удалось подобрать из этого потока, необходимо смочь получить информацию от проклято-близкого любое системное использование:
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
ls
. Он - lexing вывод ls
. Но да... Это неправильно потому что /etc/issue
абсолютно ненадежно. Полностью, полностью, полностью ненадежный. Кроме того, Ваше предположение, что никто не мог бы поместить non-os-related файл, заканчивающийся в 'выпуск' или 'версию', неблагоразумно.
– Parthian Shot
18.02.2016, 20:50
more reliable options
Ну, с одной стороны, существует только одна опция. Таким образом, так принимая я согласился с Вашим предположением, что это более надежно (который я не делаю), давайте не запускать pluralizing вещи. Во-вторых, если бы кто-то на самом деле использовал Ваше решение, и оно крайне привело половину к сбою времени, то к ним не подключилось бы с консоли то, что оно еще перестало работать в "если". Ни одна из моих систем не имеет lsb
установленный по умолчанию.
– Parthian Shot
19.02.2016, 16:09
эта команда основана на ответах Joseph R. и slm.
Она просто ищет файлы типа /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]
Если для него призвана ситуация, вы можете удаленно использовать 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, работающие с правильными настройками строк сообщества.
Используйте/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.