Jak mogę w wiarygodny sposób uzyskać nazwę systemu operacyjnego?

69

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_releasepolecenie:

$ 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_releasepolecenie jest stosunkowo nowe, więc co zrobić, jeśli muszę uzyskać system operacyjny starszego systemu?

W każdym razie lsboznacza, Linux Standard Basewięc zakładam, że nie będzie działać na uniksowych systemach Linux. O ile mi wiadomo, nie ma sposobu, aby uzyskać te informacje, unamewięc jak mogę uzyskać je w systemach, które nie używają lsb_release?

terdon
źródło
1
unix.stackexchange.com/questions/6345/... dla systemu Linux. uname -spowinno wystarczyć poza Linuksem (prawdopodobnie w przypadku BSD).
Mat
Wymeldowałeś się facter? facter operatingsystempowinieneś robić, co chcesz, na wszystkich systemach, z którymi facterwspółpracujesz.
Joseph R.
@JosephR. wygląda dobrze, ale nie jest domyślnie instalowany.
terdon
1
Wkleiłem facterkod, który pobiera nazwę systemu operacyjnego na pastebin. Znajdź je tutaj . Sprawdza wiele różnych plików, aby niezawodnie uzyskać nazwę.
Joseph R.
@JosephR. wow, to dużo plików. Przeniesię to, żeby walnąć, kiedy tylko będę miał szansę, powinno być wystarczająco przenośne. Dzięki!
terdon

Odpowiedzi:

72

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 lsbpolecenie 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

Grupa robocza LSB ma za swój główny cel zaradzić tym dwóm obawom. Publikujemy standard opisujący minimalny zestaw interfejsów API, które musi obsługiwać dystrybucja, w porozumieniu z głównymi dostawcami dystrybucji. Zapewniamy również testy i narzędzia, które mierzą wsparcie dla standardu i pozwalają twórcom aplikacji na wybranie wspólnego zestawu. Wreszcie, poprzez nasze prace testowe, staramy się zapobiec niepotrzebnej rozbieżności między dystrybucjami.

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

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

Ta sama strona zawiera także przydatny skrypt, który próbuje skodyfikować powyższe za pomocą tylko waniliowych unamepoleceń 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

#!/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}

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.

# 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

Ten fragment kodu może zostać włączony do pliku systemowego /etc/bashrclub innego takiego pliku, który następnie ustawi zmienną środowiskową $DISTRO.

gcc

Wierzcie lub nie, inną metodą jest wykorzystanie gcc. Jeśli gcc --versionzapytasz o polecenie , otrzymasz dystrybucję, dla której zbudowano gcc, która jest niezmiennie taka sama jak system, na którym działa.

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;

Którego powinienem użyć? Chciałbym raczej iść z lsb_release -awszelkich 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

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

Oto odpowiedź Roba

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
źródło
1
Uwaga: właśnie zrobiłem szybkie sprawdzenie komputerów z systemami AIX i SunOS. Wygląda na to, że nie mają zainstalowanego lsb_release (a przecież jest to Unix, a nie Linux). Problem z gcc polega na tym, że niektóre ppl zaczynają teraz używać clang. Nigdy też nie możesz być pewien, którego gcc użyto do zbudowania (w systemach, z którymi pracuję, jest co najmniej kilka wersji na każdym). Głosuję więc na rozwiązanie Python, ponieważ domyślnie wydaje się, że jest teraz instalowane wszędzie.
elmo
@elmo - tak LSB to Linux Standard Base, więc nie spodziewałbym się, że będzie go miał system AIX lub SunOS. Moje doświadczenie z SunOS ma ponad 15 lat, a większość dostawców, z którymi miałem do czynienia, zazwyczaj zapewniałby własny skrypt powłoki podobny do tych, o których wspomniałem powyżej. Do Solaris 11 Python nie był opcją. I to sprawia, że ​​trudno jest zgrać orzecha. Jeśli dostarczasz oprogramowanie, które musi działać w systemach Solaris 9, 10, 11, AIX i kilku dystrybucjach systemu Linux (SUSE, Ubntu i RHEL), co robisz? Python nie jest opcją, więc masz ręcznie kodowany skrypt powłoki.
slm
@elmo - gcc jednak, opcja, nie wydaje mi się również atrakcyjna. Wydaje się, że jest to spowodowane zbyt wieloma problemami, demonstrowałem to jedynie jako opcję.
slm
@elmo - spójrz na kod stojący za tą funkcją, hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Wielka niespodzianka, że ​​używa LSB!
slm
@slm: Mam dostęp do komputera z systemem SunOS 5.10 (zakładam, że na twojej liście jest 10 - nie znam się na numerach wersji / konwencjach Sun) i ma on Pythona. Mam dostęp do komputera z systemem AIX 7 i ma on język Python. Maszyny z systemem Linux oczywiście też to mają. Tak więc Python wygląda jak najbardziej przenośny wybór. Jeśli chodzi o Sun poniżej 10, nie jestem pewien, dlaczego nie pozwoliłby na zainstalowanie Pythona (co prawda brakuje aktualnej instalacji tj. Ncurses i ctypy, więc kto wie). Jeśli chodzi o Python korzystający z LSB, nie jest zaskoczeniem dla Linuksa, jeśli jest to podejście domyślne.
elmo
16

Ponieważ prawdopodobnie nie będziesz w stanie zainstalować facterna zdalnym serwerze, możesz naśladować to, co robi, aby znaleźć nazwę systemu operacyjnego. Kod Ruby dla tego operatingsystemfaktu można znaleźć tutaj na pastebin . Zasadniczo przegląda różne *-releasepliki i inne, aby określić nazwę systemu operacyjnego.

Niektóre pliki, na które patrzy:

/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

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).

Joseph R.
źródło
5
„Przykro mi, jeśli znajdziesz duplikaty na tej liście, stworzyłem je szybko z grep”. ... | uniq?
new123456,
@ new123456 Prawo. Dzięki. Kluczowym słowem jest tutaj „szybko” :)
Joseph R.
Przepraszam, że nie zaakceptowałem tego, ale odpowiedź @ slm jest zbyt wyczerpująca, aby zignorować :).
terdon
3
co z / etc / os-release?
Yauhen Yakimovich
1
@ new123456 Technicznie tak powinno być ... | sort -u. uniqznajduje tylko sąsiadujące unikalne elementy.
Parthian Shot
9

Jeśli pythonzainstalowałeś (nie ma znaczenia, czy Python 3 czy Python 2), możesz znaleźć nazwę dystrybucji bez ponownego tworzenia koła :

python -c "import platform;print(platform.linux_distribution()[0])"
heinrich5991
źródło
Jeśli masz ochotę skorzystać z tej opcji, upewnij się, że Twój system operacyjny jest obsługiwany: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Jeśli nie, możesz dodać więcej do listy: coderwall.com/p/cwrenq
slm
1
To nie będzie działać ze starymi dystrybucjami Linuksa. Na przykład: SuSE 7.0 miał Python 1.5.2, a moduł platformy został dodany nie przed pojawieniem się Python 2.3 w 2003 roku ;-)
pefu
6

/etc/issuepowinien zawierać informacje o wersji. Jestem pewien, że widziałem to na systemach Solaris. Oto plik z nowoczesnego systemu Debian:

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

$ 

Problem / etc / jest również wspomniany w FHS (który nie dotyczy wyłącznie systemów Linux), chociaż jest „opcjonalny”.

drewbenn
źródło
Ach, to dobra sugestia, +1. Nie zawsze może to działać, ale 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.
terdon
2
/etc/issuejest całkowicie zawodny. (Widzę systemy w wersji XY z /etc/issuebanerem informującym, że były to YZ po złym zarządzaniu łatkami. Może zawierać absolutnie wszystko.)
Mat.
Zalecane jest wypełnienie tego pliku. legalne rzeczy, takie jak kto może się zalogować.
Nils
Zalecane przez wytyczne bezpieczeństwa i audytorów. Był kiedyś taki przypadek prawny, w którym haker wyszedł bez kary, ponieważ ZAPRASZAMY w / etc / issue
Nils
@drewbenn strona man mówi to, co zacytowałem w moim pierwszym komentarzu, nic nie wskazuje na to, że musi zawierać informacje o systemie. Po prostu często tak jest.
terdon
6

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”.

boz
źródło
Dzięki, ale żadna nie jest pomocna, jeśli chodzi o Unixa lub inny niż Linux * nix.
terdon
3

Użyłem tego polecenia powłoki, aby uzyskać ciąg znaków wskazujący dystrybucję Linuksa:

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;

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ę

  • CentOS (centos)
  • RedHat (redhat)
  • Debian (debian)
  • Arch (arch)
  • OpenSUSE (OpenSUSE)
  • Fedora (fedora)
  • Ubuntu (debian)
scrutari
źródło
Czy nie for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; donedziałałyby równie dobrze na wszystkich z nich? Nie rozumiem, dlaczego najpierw miałbyś findwszystkie pliki /etc.
terdon
Dziękuję za twoją opinię, terdon, ale twoje polecenie podaje 0 linii przynajmniej w Cent OS i Fedorze
scrutari
1

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.0Obiekt w SNMPv2-MIB może pomóc dowiedzieć się, jakie OS masz kontaktu, pod warunkiem Tam jest demon SNMP działa w systemie docelowym:

Opis

Opis tekstowy jednostki. Ta wartość powinna zawierać pełną nazwę i identyfikację wersji typu sprzętu systemu, systemu operacyjnego i oprogramowania sieciowego.

Status: aktualny

Dostęp: tylko do odczytu

Strona snmpget(1)wyjaśnia, w jaki sposób pobrać tę wartość z przykładami.

dawud
źródło
Wadą jest to, że jest to ciąg statyczny, który nie jest automatycznie utrzymywany.
Nils
1

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 ...

Nils
źródło
Kim jesteśmy'? A co z Uniksem?
terdon
@terdon jesteśmy naszym zespołem w pracy. W Uniksie możesz zrobić to samo, jeśli odpowiednie rozszerzenie jest skompilowane do snmpd.
Nils
Ach, myślałem, że należysz do jakiejś grupy standardów :)
terdon
@terdon Zaczynasz opracowywać standardy witryn, gdy musisz zarządzać ponad 80 serwerami. Opracowaliśmy tę metodę, abyśmy mogli monitorować, czy system operacyjny jest przestarzały (EoL mniejszy, a nawet większy numer)
Nils,
1

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:

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
źródło
2
nie analizuj wyjścia ls!
heinrich5991
@ heinrich5991 dlaczego nie?
Sammitch,
Technicznie nie analizuje wyników ls. Jest Lexing wyjście ls. Ale tak ... To jest złe, ponieważ /etc/issuejest 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.
Parthian Shot
@ParthianShot Więc głównie chcesz narzekać na drugi i trzeci poziom rezerwy w przypadku, gdy bardziej niezawodne opcje nie są dostępne?
Sammitch,
@Sammitch more reliable optionsCóż, 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ł lsbzainstalowany domyślnie.
Parthian Shot
1

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:

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 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.

xpros
źródło
Co jest snpwalk? Gdzie mogę to znaleźć? Ponadto, to po prostu drukuje „Linux”, bez informacji o dystrybucji (co jest tym, czego chcę, unamemoże mi dać Linux). Czy to działa w systemach operacyjnych innych niż Linux? Na przykład w systemie UNIX, BSD lub OSX?
terdon
snmpwalk to narzędzie wiersza poleceń systemu Linux. Nie tylko drukuje „Linux”, ale także drukuje wersję jądra, która tak naprawdę jest jedyną rzeczą, której potrzebujesz. Jeśli SNMP jest skonfigurowany na innych hostach, niezależnie od tego, czy jest to UNIX, BSD, OSX, snmpwalk będzie działał tak, jak jest standardem (v1 | v2c | v3), a nawet będzie działał na wodzie również na hostach Windows. Zobacz także snmpget lub snmpgetnext.
xpros
Brzmi dobrze, ale czy mógłbyś edytować swoją odpowiedź i wyjaśnić, gdzie ją znajdziemy? Na przykład nie jest to repozytorium Debiana. Wyjaśnij też, co daje to, czego nie daje, uname -ai 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).
terdon
it also prints the kernel version which is really the only thing you needAle ... 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).
Parthian Shot
1

Użyj /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

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_releasePodaję tutaj tylko jeden argument przeciwko temu, który jest jak dotąd najlepiej ocenioną odpowiedzią z 2013 roku.

Jest już do tego narzędzie lsb_release, dlaczego po prostu tego nie użyjesz?Cóż, jest to bardzo dziwny interfejs: skrypt powłoki, który musisz wywołać (a więc odrodzić się asynchronicznie z kodu C) i nie jest napisany jako rozszerzalny. Jest to opcjonalny pakiet w wielu dystrybucjach i nic, co chcielibyśmy wywołać w ramach wczesnego rozruchu w celu wyświetlenia wiadomości powitalnej. (W czasach z sekundowym czasem uruchamiania przestrzeni użytkownika naprawdę nie chcemy wywoływać ogromnego skryptu powłoki dla błahości, takiej jak wyświetlanie wiadomości powitalnej). Wydaje się nam, że narzędzie lsb_release jest próbą wyodrębnienia kontroli dystrybucji, w których potrzebna jest standaryzacja kontroli dystrybucji. To po prostu źle zaprojektowany interfejs. Naszym zdaniem ma on zastosowanie jako interfejs do określania samej wersji LSB, ale nie do sprawdzania dystrybucji lub wersji.

anatoly techtonik
źródło
Dzięki, ale zaakceptowana odpowiedź już rozwiązuje ten problem na końcu cytatu, co wyjaśnia, że /etc/os-releasebę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.
terdon
@terdon Jestem tylko ciekawy, jakie są te systemy w 2018 roku, gdzie /etc/os-releasenie ma? Myślę, że ich baza użytkowników jest nieszczęśliwa w porównaniu do systemów, w których lsb_releasedomyś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 z systemdlinku 0pointer.de, który podałem.
anatoly techtonik
Tak, wiem, że to nie jest twoje, po prostu zastanawiałem się, dlaczego uważasz, że cytat o kodzie C jest odpowiedni. I o ile mi wiadomo, os-releaseto 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ść.
terdon
Cytat jest o lsb_releasei możesz zastąpić C przez Go i uzyskać ten sam argument. Narzut związany z uruchomieniem lsb_releasejest 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
anatoly techtonik