Скажите, что я вошел в удаленную систему, как я могу знать, что она работает? В большинстве современных 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
?
uname -s
должно быть достаточно за пределами Linux (возможно, для BSD).facter
?facter operatingsystem
следует делать то, что вы хотите, на всех системахfacter
было сделано для работы.facter
код, который получает имя операционной системы на pastebin. Найдите это здесь . Он проверяет много разных файлов, чтобы получить имя надежно.Ответы:
lsb_release -a
Скорее всего, это будет лучшим вариантом для поиска этой информации и возможности сделать это согласованным образом.История LSB
Команда
lsb
in that означает проект Linux Standards Base, являющийся зонтичным проектом, спонсируемым Linux Foundation, для предоставления общих методов выполнения базовых задач в различных дистрибутивах Linux.Проект является добровольным, и поставщики могут участвовать в проекте как пользователь, а также как посредники в различных спецификациях для различных модулей, которые помогают стимулировать стандартизацию в различных дистрибутивах Linux.
выдержка из чартера
Полезные ссылки, связанные с LSB
Критицизмы
Есть ряд проблем с LSB, которые делают его проблематичным для таких дистрибутивов, как Debian. Принудительное использование RPM. Смотрите статью в Википедии, чтобы узнать больше .
Novell
Если вы будете искать, вы, возможно, найдете довольно устаревшую страницу под названием: « Определение лежащего в основе дистрибутива Linux от Novell». Это одно из немногих мест, где я видел реальный список, который показывает несколько основных дистрибутивов и как вы можете определить, какой из них вы используете.
выдержка
Эта же страница также включает в себя удобный скрипт, который пытается кодифицировать вышеперечисленное, используя только ванильные
uname
команды, и наличие одного из вышеуказанных файлов.ПРИМЕЧАНИЕ. Этот список датирован, но вы можете легко удалить устаревшие дистрибутивы, такие как Mandrake, из списка и заменить их альтернативами. Этот тип сценария может быть одним из подходов, если вы пытаетесь поддерживать большое количество вариантов Solaris и Linux.
Linux Mafia
Дальнейший поиск приведет к появлению следующей страницы на Linuxmafia.com под названием: / etc / release эквиваленты для различных дистрибутивов Linux (и других Unix) . Это, наверное, самый полный список на сегодняшний день, который я когда-либо видел. Вы можете кодифицировать этот список с помощью оператора case / switch и включить его в свой дистрибутив программного обеспечения.
На самом деле в нижней части этой страницы есть скрипт, который делает именно это. Таким образом, вы можете просто загрузить и использовать скрипт в качестве стороннего поставщика для распространения вашего программного обеспечения.
скрипт
ПРИМЕЧАНИЕ: этот скрипт должен выглядеть знакомо, это современная версия Novell!
Сценарий места для ног
Другой метод, который я видел, - это использовать свой собственный скрипт, аналогичный описанному выше методу Novell, но вместо этого использовать LSB. В этой статье под названием « Общий метод определения имени распространения Linux (или UNIX)» показан один из таких методов.
Этот кусок кода может быть включен в системный
/etc/bashrc
или некоторый такой файл, который затем установит переменную среды$DISTRO
.НКУ
Верьте этому или нет другой метод состоит в том, чтобы использовать
gcc
. Если вы запросите команду,gcc --version
вы получите дистрибутив, для которого был создан gcc, который неизменно совпадает с системой, в которой он работает.Fedora 14
CentOS 5.x
CentOS 6.x
Ubuntu 12.04
TL; DR;
Так какой из них я должен использовать? Я бы предпочел использовать
lsb_release -a
любые дистрибутивы Linux, которые я бы часто посещал (RedHat, Debian, Ubuntu и т. Д.). Для ситуаций, когда вы поддерживаете системы, которые не предоставляют,lsb_release
я бы включил свою собственную как часть поставляемого мной программного обеспечения, аналогично одному из приведенных выше сценариев.ОБНОВЛЕНИЕ № 1: продолжение с SuSE
Говоря с @Nils в комментариях ниже, было установлено, что по какой-то причине SLES11, по-видимому, отбрасывает LSB из установленного по умолчанию. Это была только необязательная установка, которая казалась противодействующей пакету, который предоставляет ключевую функцию этого типа.
Поэтому я воспользовался возможностью, чтобы связаться с кем-то из проекта OpenSuSE, чтобы понять почему.
выдержка из электронной почты
Вот ответ Роба
источник
Поскольку вы, вероятно, не сможете установить
facter
на удаленный сервер, вы можете имитировать то, что он делает, чтобы найти имя ОС. Код Ruby для этогоoperatingsystem
факта можно найти здесь на pastebin . По сути, он просматривает различные*-release
файлы и другие файлы, чтобы определить имя ОС.Некоторые из файлов, на которые это смотрит:
Извините, если вы найдете дубликаты в этом списке, я быстро их создал
grep
. Должно быть довольно легко (хотя и немного утомительно) перенести это в сценарий оболочки POSIX.источник
... | uniq
?... | sort -u
.uniq
находит только смежные уникальные элементы.Если вы
python
установили (неважно, Python 3 или Python 2), вы можете узнать имя дистрибутива, не изобретая колесо заново :источник
/etc/issue
должен содержать информацию о выпуске. Я вполне уверен, что видел это в системах Solaris. Вот файл из современной системы Debian:/ etc / issue также упоминается в FHS (что не только для систем Linux), хотя это «необязательно».
источник
The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.
кажется, что системный администратор может написать все, что пожелает./etc/issue
совершенно ненадежно. (Я вижу системы в версии XY со/etc/issue
знаменем, в котором говорится, что они были YZ из-за неправильного управления патчами. Он может содержать абсолютно все.)Вы не можете достоверно получить имя дистрибутива из одной команды во всех дистрибутивах. Некоторые доступны через / etc / * - release, а другие доступны через команду 'lsb-release'.
источник
Я использовал эту команду оболочки, чтобы получить строку, указывающую на дистрибутив Linux:
эта команда основана на ответах Джозефа Р. и Слм.
Он просто ищет файлы, такие как / etc / {osname} -release или / etc / {osname} _version, и печатает конкретное имя операционной системы.
Он работал в
источник
for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; done
одинаково хорошо работать на всех из них? Я не понимаю, почему вы должны сначалаfind
все файлы в/etc
.SNMP является достаточно вездесущим протоколом, который можно найти во многих различных дистрибутивах GNU / Linux и системах UNIX.
system.sysDescr.0
Объект в SNMPv2-MIB может помочь вам узнать, какие ОС вы связываетесь, при условии , что есть демон SNMP работает в целевой системе:Страница
snmpget(1)
man объясняет, как получить это значение с примерами.источник
Поскольку не существует распространенного способа сделать это, мы определили строку освобождения с помощью команды snmp exec.
Задача этой команды - распечатать дистрибутив и текущую основную / вспомогательную версию операционной системы.
На RH и клонах мы разбираем / etc / redhat-release, на SuSe SuSe-release ...
источник
Из того, что мне удалось почерпнуть из этой темы, вы сможете получить информацию из любой системы, используя:
источник
ls
. Он лексирует выводls
. Но да ... Это неправильно, потому что/etc/issue
совершенно ненадежно. Совершенно, совершенно, совершенно ненадежно. Кроме того, ваше предположение, что никто не может поместить файл, не связанный с os, заканчивающийся на «release» или «version», не имеет смысла.more reliable options
Ну, с одной стороны, есть только один вариант. Поэтому, даже если предположить, что я согласен с вашим предположением, что это более надежно (чего я не делаю), давайте не будем начинать множественное число. Во-вторых, если кто-то на самом деле использовал ваше решение, и оно полностью провалилось половину времени, его не утешит тот факт, что оно потерпело неудачу в «другом случае, если». Ни одна из моих систем неlsb
установлена по умолчанию.Если ситуация требует этого, вы можете узнать об этом удаленно, используя snmpwalk [или протокол SNMP в целом]. Пример ниже:
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 с правильной настройкой строк сообщества.
источник
snpwalk
? Где я могу найти его? Кроме того, это просто печатает «Linux», никакой информации о распространении (что я хочу,uname
может дать мнеLinux
). Это работает на не-Linux ОС? На UNIX говорят, или на BSD или на OSX?uname -a
а что нет, и как он может сказать мне название дистрибутива, о котором идет речь в этом вопросе. В любом случае, даже если предположить, что он может вернуть эту информацию, поскольку это нестандартная утилита, которую нужно установить, я не уверен, что она будет здесь полезной. Идея состоит в том, чтобы войти в удаленную систему и выяснить ОС (включая дистрибутив, если это Linux).it also prints the kernel version which is really the only thing you need
Но ... в этом весь смысл этого вопроса. Если бы это было действительно все, что вам нужно, вы могли бы просто использоватьuname -a
. Ядро является важной частью операционной системы, но это не вся операционная система. Компоновка файловой системы и утилиты пользователя (например, менеджер пакетов) имеют значение.Используйте
/etc/os-release
:Причины хорошо объяснены в FAQ по ссылке http://0pointer.de/blog/projects/os-release.html, безвозмездно предоставленной @weberjn в этом комментарии . Я просто перечисляю здесь один аргумент против использования
lsb_release
ответа, который до сих пор является самым популярным ответом 2013 года.источник
/etc/os-release
это станет более стандартным. Однако этот файл не всегда присутствует во всех системах, поэтому принятый ответ дает более портативные альтернативы. Кроме того, я не знаю, почему вы упоминаете код на C, вопрос не в том, чтобы вызывать что-либо из C./etc/os-release
нет? Я предполагаю, что их пользовательская база несчастна по сравнению с системами, которыеlsb_release
не поставляются по умолчанию. По крайней мере, я не смог использовать ваш принятый ответ на Fedora. Что касается комментариев C, то это не мояsystemd
ссылка , а цитата из ссылки 0pointer.de, которую я предоставил.os-release
это в основном или исключительно Linux. Кажется, что он определен FreeDesktop.org, так что, возможно, некоторые версии Unix также используют его, но я сомневаюсь, что вы найдете его в большинстве или во встроенных системах или в любой системе без графического интерфейса и т. Д. Наконец, не забывайте, что много мест до сих пор используют очень старые машины из соображений стабильности.lsb_release
и вы можете заменить C на Go и получить тот же аргумент. Затраты на запускlsb_release
намного выше с точки зрения безопасности и производительности, чем просто анализ статического файла. Я не верю в очень старые машины, обеспечивающие стабильность. Сердцебиение и друзья должны были забрать их давным-давно, так что просто используйте/etc/os-release