Załóżmy, że jestem zalogowany do systemu zdalnego. Skąd mam wiedzieć, co to działa? W większości współczesnych Linuksów (Linuces?) Masz lsb_release
polecenie:
$ lsb_release -ic
Distributor ID: LinuxMint
Codename: debian
Co, o ile mogę powiedzieć, daje te same informacje, co /etc/lsb-release
. Co jeśli ten plik nie jest obecny? Wydaje mi się, że pamiętam, że lsb_release
polecenie jest stosunkowo nowe, więc co zrobić, jeśli muszę uzyskać system operacyjny starszego systemu?
W każdym razie lsb
oznacza, Linux Standard Base
więc zakładam, że nie będzie działać na uniksowych systemach Linux. O ile mi wiadomo, nie ma sposobu, aby uzyskać te informacje, uname
więc jak mogę uzyskać je w systemach, które nie używają lsb_release
?
uname -s
powinno wystarczyć poza Linuksem (prawdopodobnie w przypadku BSD).facter
?facter operatingsystem
powinieneś robić, co chcesz, na wszystkich systemach, z którymifacter
współpracujesz.facter
kod, który pobiera nazwę systemu operacyjnego na pastebin. Znajdź je tutaj . Sprawdza wiele różnych plików, aby niezawodnie uzyskać nazwę.Odpowiedzi:
lsb_release -a
prawdopodobnie będzie najlepszą opcją dla znalezienia tych informacji i być w stanie to zrobić w spójny sposób.Historia LSB
To
lsb
polecenie oznacza projekt Linux Standards Base, który jest parasolowym projektem sponsorowanym przez Linux Foundation, zapewniającym ogólne metody wykonywania podstawowych czynności na różnych dystrybucjach Linuxa.Projekt jest dobrowolny, a dostawcy mogą uczestniczyć w nim jako użytkownicy, a także jako facylitatorzy różnych specyfikacji dotyczących różnych modułów, które pomagają w standaryzacji w różnych dystrybucjach Linuksa.
Wyciąg z Karty
Przydatne linki związane z LSB
Krytyka
Istnieje wiele problemów z LSB, które sprawiają, że jest to problematyczne dla dystrybucji takich jak Debian. Wymuszone użycie RPM jest jednym. Więcej informacji na ten temat znajduje się w artykule w Wikipedii .
Novell
Jeśli szukasz, prawdopodobnie natkniesz się na dość przestarzałą stronę zatytułowaną: Wykrywanie bazowej dystrybucji Linuksa firmy Novell. Jest to jedno z niewielu miejsc, w których widziałem rzeczywistą listę, która pokazuje kilka głównych dystrybucji i jak możesz wykryć, z którego podstawowego korzystasz.
fragment
Ta sama strona zawiera także przydatny skrypt, który próbuje skodyfikować powyższe za pomocą tylko waniliowych
uname
poleceń i obecności jednego z powyższych plików.UWAGA: Ta lista jest datowana, ale można łatwo usunąć z niej datowane dystrybucje, takie jak Mandrake, i zastąpić je alternatywami. Ten typ skryptu może być jednym z podejść, jeśli próbujesz obsłużyć duży zbiór wariantów Solaris i Linux.
Linux Mafia
Dalsze wyszukiwanie spowoduje wyświetlenie następującej strony utrzymywanej na Linuxmafia.com, zatytułowanej: / etc / release odpowiedniki dla różnych dystrybucji Linuksa (i innych uniksowych) . To chyba najbardziej wyczerpująca lista, jaką do tej pory widziałem. Możesz skodyfikować tę listę za pomocą instrukcji case / switch i dołączyć ją jako część dystrybucji oprogramowania.
W rzeczywistości na dole tej strony znajduje się skrypt, który właśnie to robi. Możesz więc po prostu pobrać skrypt i używać go jako strony trzeciej w dystrybucji oprogramowania.
scenariusz
UWAGA: Ten skrypt powinien wyglądać znajomo, jest to aktualna wersja Novella!
Scenariusz miejsca na nogi
Inną metodą, którą widziałem, jest uruchomienie własnego skryptu, podobnego do powyższej metody Novella, ale zamiast tego użycie LSB. W tym artykule zatytułowanym: Ogólna metoda określania nazwy dystrybucji systemu Linux (lub UNIX) pokazano jedną z takich metod.
Ten fragment kodu może zostać włączony do pliku systemowego
/etc/bashrc
lub innego takiego pliku, który następnie ustawi zmienną środowiskową$DISTRO
.gcc
Wierzcie lub nie, inną metodą jest wykorzystanie
gcc
. Jeśligcc --version
zapytasz o polecenie , otrzymasz dystrybucję, dla której zbudowano gcc, która jest niezmiennie taka sama jak system, na którym działa.Fedora 14
CentOS 5.x
CentOS 6.x
Ubuntu 12.04
TL; DR;
Którego powinienem użyć? Chciałbym raczej iść z
lsb_release -a
wszelkich dystrybucjach systemu Linux, które chciałbym częste (RedHat, Debian, Ubuntu, itd.). W sytuacjach, w których wspierasz systemy, które nie zapewniająlsb_release
, stworzę własne w ramach dystrybucji oprogramowania, które zapewniam, podobnie jak w jednym z powyższych skryptów.AKTUALIZACJA # 1: Kontynuacja za pomocą SuSE
Mówiąc z @Nils w poniższych komentarzach ustalono, że z jakiegokolwiek powodu SLES11 wydawał się domyślnie usuwać LSB z instalacji. Była to tylko opcjonalna instalacja, która wydawała się przeciwna pakietowi, który zapewnia tego rodzaju kluczową funkcję.
Skorzystałem więc z okazji, aby skontaktować się z kimś z projektu OpenSuSE, aby dowiedzieć się, dlaczego.
fragment wiadomości e-mail
Oto odpowiedź Roba
źródło
Ponieważ prawdopodobnie nie będziesz w stanie zainstalować
facter
na zdalnym serwerze, możesz naśladować to, co robi, aby znaleźć nazwę systemu operacyjnego. Kod Ruby dla tegooperatingsystem
faktu można znaleźć tutaj na pastebin . Zasadniczo przegląda różne*-release
pliki i inne, aby określić nazwę systemu operacyjnego.Niektóre pliki, na które patrzy:
Przepraszam, jeśli znajdziesz duplikaty na tej liście, szybko je utworzyłem
grep
. Przeniesienie tego do skryptu powłoki POSIX powinno być dość łatwe (choć trochę nudne).źródło
... | uniq
?... | sort -u
.uniq
znajduje tylko sąsiadujące unikalne elementy.Jeśli
python
zainstalowałeś (nie ma znaczenia, czy Python 3 czy Python 2), możesz znaleźć nazwę dystrybucji bez ponownego tworzenia koła :źródło
/etc/issue
powinien zawierać informacje o wersji. Jestem pewien, że widziałem to na systemach Solaris. Oto plik z nowoczesnego systemu Debian:Problem / etc / jest również wspomniany w FHS (który nie dotyczy wyłącznie systemów Linux), chociaż jest „opcjonalny”.
źródło
The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.
wydaje się, że sysadmin powinien napisać cokolwiek zechce./etc/issue
jest całkowicie zawodny. (Widzę systemy w wersji XY z/etc/issue
banerem informującym, że były to YZ po złym zarządzaniu łatkami. Może zawierać absolutnie wszystko.)Nie można niezawodnie uzyskać nazwy dystrybucji z jednego polecenia we wszystkich dystrybucjach. Niektóre są dostępne za pośrednictwem / etc / * - release, a inne za pomocą polecenia „lsb-release”.
źródło
Użyłem tego polecenia powłoki, aby uzyskać ciąg znaków wskazujący dystrybucję Linuksa:
to polecenie opiera się na odpowiedziach Josepha R. i slm.
Po prostu szuka plików takich jak / etc / {osname} -release lub / etc / {osname} _version i wypisuje konkretną nazwę systemu operacyjnego.
Udało się
źródło
for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; done
działałyby równie dobrze na wszystkich z nich? Nie rozumiem, dlaczego najpierw miałbyśfind
wszystkie pliki/etc
.SNMP jest protokołem na tyle wszechobecnym, że można go znaleźć w wielu różnych rodzajach dystrybucji GNU / Linux i systemach UNIX.
system.sysDescr.0
Obiekt w SNMPv2-MIB może pomóc dowiedzieć się, jakie OS masz kontaktu, pod warunkiem Tam jest demon SNMP działa w systemie docelowym:Strona
snmpget(1)
wyjaśnia, w jaki sposób pobrać tę wartość z przykładami.źródło
Ponieważ nie ma wspólnego sposobu, aby to zrobić, zdefiniowaliśmy ciąg wydania za pomocą polecenia snmp exec.
Zadaniem tego polecenia jest wydrukowanie dystrybucji i bieżącej wersji major / minor systemu operacyjnego.
Na RH i klonach parsujemy / etc / redhat-release, na SuSe SuSe-release ...
źródło
Z tego, co udało mi się zebrać z tego wątku, powinieneś być w stanie uzyskać informacje z cholernie blisko dowolnego systemu, używając:
źródło
ls
. Jest Lexing wyjściels
. Ale tak ... To jest złe, ponieważ/etc/issue
jest całkowicie zawodne. Zupełnie, całkowicie, całkowicie zawodnie. Również twoje założenie, że nikt nie może umieścić pliku niezwiązanego z systemem operacyjnym kończącego się na „release” lub „version”, jest nierozsądne.more reliable options
Cóż, z jednej strony jest tylko jedna opcja. Więc nawet zakładając, że zgodziłem się z twoim założeniem, że jest bardziej niezawodny (czego nie robię), nie zaczynajmy pluralizować rzeczy. Po drugie, jeśli ktoś faktycznie skorzystałby z twojego rozwiązania, które całkowicie zawiodło go przez połowę czasu, nie pocieszałoby go to, że zawiodło w „innym przypadku”. Żaden z moich systemów nie zostałlsb
zainstalowany domyślnie.Jeśli sytuacja tego wymaga, możesz dowiedzieć się zdalnie, używając snmpwalk [lub ogólnie protokołu SNMP]. Przykład jest poniżej:
OUPUT: sysDescr.0 = STRING: Linux example.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP Sob Sep 14 05:32:37 EDT 2013 x86_64
Kluczem do niezawodności jest to, czy SNMP jest poprawnie skonfigurowany w twoim środowisku, na wszystkich hostach działa snmp z prawidłową konfiguracją ciągów społeczności.
źródło
snpwalk
? Gdzie mogę to znaleźć? Ponadto, to po prostu drukuje „Linux”, bez informacji o dystrybucji (co jest tym, czego chcę,uname
może mi daćLinux
). Czy to działa w systemach operacyjnych innych niż Linux? Na przykład w systemie UNIX, BSD lub OSX?uname -a
i jak może mi powiedzieć nazwę dystrybucji, na której dotyczy to pytanie. W każdym razie, nawet zakładając, że może zwrócić te informacje, ponieważ jest to niestandardowe narzędzie i musi zostać zainstalowane, nie jestem pewien, czy przydałoby się tutaj. Pomysł polega na zalogowaniu się do zdalnego systemu i sprawdzeniu systemu operacyjnego (w tym dystrybucji, jeśli jest to Linux).it also prints the kernel version which is really the only thing you need
Ale ... to jest sedno tego pytania. Jeśli to naprawdę wszystko, czego potrzebujesz, możesz po prostu użyćuname -a
. Jądro jest ważną częścią systemu operacyjnego, ale nie jest to cały system operacyjny. Liczy się układ systemu plików i narzędzia użytkownika (np. Menedżer pakietów).Użyj
/etc/os-release
:Przyczyny są dobrze wyjaśnione w FAQ przez link http://0pointer.de/blog/projects/os-release.html bezpłatnie podany przez @weberjn w tym komentarzu .
lsb_release
Podaję tutaj tylko jeden argument przeciwko temu, który jest jak dotąd najlepiej ocenioną odpowiedzią z 2013 roku.źródło
/etc/os-release
będzie on bardziej standardowy. Jednak ten plik nie zawsze jest dostępny we wszystkich systemach, dlatego zaakceptowana odpowiedź daje bardziej przenośne alternatywy. Ponadto nie wiem, dlaczego wspominasz o kodzie C, nie chodzi o to, aby wywoływać cokolwiek z C./etc/os-release
nie ma? Myślę, że ich baza użytkowników jest nieszczęśliwa w porównaniu do systemów, w którychlsb_release
domyślnie nie jest dostarczana. Przynajmniej nie mogłem użyć Twojej zaakceptowanej odpowiedzi w Fedorze. Jeśli chodzi o komentarz C, to nie jest mój, ale cytat zsystemd
linku 0pointer.de, który podałem.os-release
to głównie lub wyłącznie sprawa Linuksa. Wydaje się, że jest zdefiniowany przez FreeDesktop.org, więc może niektóre smaki Uniksa również go używają, ale wątpię, czy znajdziesz go w większości, w systemach wbudowanych lub w dowolnym systemie innym niż GUI itp. Wreszcie, nie zapominaj o tak wielu miejscach nadal używam bardzo starych maszyn ze względu na stabilność.lsb_release
i możesz zastąpić C przez Go i uzyskać ten sam argument. Narzut związany z uruchomieniemlsb_release
jest znacznie wyższy zarówno z punktu widzenia bezpieczeństwa, jak i wydajności niż zwykłe analizowanie pliku statycznego. Nie wierzę w bardzo stare maszyny zapewniające stabilność. Heartbleed i przyjaciele powinni byli zabrać ich dawno temu, więc po prostu użyj/etc/os-release