Wie kann ich den Namen des Betriebssystems zuverlässig ermitteln?

69

Angenommen, ich bin bei einem Remote-System angemeldet. Woher weiß ich, was ausgeführt wird? Auf den meisten modernen Linuxen (Linuces?) Haben Sie den lsb_releaseBefehl:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Was soweit ich das beurteilen kann nur die gleichen Infos gibt wie /etc/lsb-release. Was ist, wenn diese Datei nicht vorhanden ist? Ich scheine mich zu erinnern, dass der lsb_releaseBefehl relativ neu ist. Was ist, wenn ich das Betriebssystem eines älteren Systems haben muss?

Auf jeden Fall lsbsteht für Linux Standard Basealso gehe ich davon aus, dass es auf Nicht-Linux-Unices nicht funktioniert. Soweit ich weiß, gibt es keine Möglichkeit, diese Informationen unameabzurufen. Wie kann ich diese Informationen auf Systemen abrufen, die nicht verwendet werden lsb_release?

terdon
quelle
1
unix.stackexchange.com/questions/6345/… für Linux. uname -ssollte außerhalb von Linux reichen (evtl. für die BSDs rechnen).
Mat
Hast du ausgecheckt facter? facter operatingsystemsollte tun, was Sie wollen, auf allen Systemen facterwurde gemacht, um mit zu arbeiten.
Joseph R.
@ JosephR. sieht gut aus, ist aber nicht standardmäßig installiert.
Terdon
1
Ich habe den facterCode, der den Namen des Betriebssystems erhält, in Pastebin eingefügt . Finden Sie es hier . Es prüft viele verschiedene Dateien, um den Namen zuverlässig zu erhalten.
Joseph R.
@ JosephR. Wow, das sind viele Dateien. Ich werde das portieren, um zu schlagen, wenn ich die Chance habe, das sollte tragbar genug sein. Vielen Dank!
terdon

Antworten:

72

lsb_release -a Dies ist wahrscheinlich die beste Option, um diese Informationen herauszufinden und dies auf konsistente Weise zu tun.

Geschichte der LSB

Der lsbBefehl in diesem Befehl steht für das Projekt Linux Standards Base , ein von der Linux Foundation gesponsertes Rahmenprojekt , das allgemeine Methoden für grundlegende Aufgaben in verschiedenen Linux-Distributionen bereitstellt.

Das Projekt ist freiwillig, und Anbieter können sich nur als Benutzer und als Vermittler der verschiedenen Spezifikationen für verschiedene Module, die dazu beitragen, die Standardisierung in den verschiedenen Linux-Distributionen voranzutreiben, an dem Projekt beteiligen.

Auszug aus der Charter

Die LSB-Arbeitsgruppe hat sich zum Ziel gesetzt, diese beiden Anliegen anzusprechen. Wir veröffentlichen einen Standard, der die Mindestanzahl von APIs beschreibt, die eine Distribution in Absprache mit den wichtigsten Distributionsanbietern unterstützen muss. Wir stellen auch Tests und Tools zur Verfügung, mit denen die Unterstützung für den Standard gemessen und Anwendungsentwickler in die Lage versetzt werden, auf den gemeinsamen Satz abzustimmen. Schließlich versuchen wir durch unsere Testarbeit, unnötige Abweichungen zwischen den Distributionen zu verhindern.

Nützliche Links zu LSB

Kritikpunkte

Es gibt eine Reihe von Problemen mit LSB, die es für Distributionen wie Debian problematisch machen. Die erzwungene Verwendung von RPM ist eine. Weitere Informationen finden Sie im Wikipedia-Artikel .

Novell

Wenn Sie suchen, werden Sie möglicherweise auf eine ziemlich veraltete Seite mit dem Titel stoßen: Erkennen der zugrunde liegenden Linux-Distribution von Novell. Dies ist einer der wenigen Orte, an denen ich eine aktuelle Liste gesehen habe, in der mehrere der wichtigsten Distributionen aufgeführt sind und wie Sie feststellen können, welche zugrunde liegende Distribution Sie verwenden.

Auszug

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

Auf derselben Seite befindet sich auch ein praktisches Skript, das versucht, das oben Genannte mit nur Vanille- unameBefehlen und dem Vorhandensein einer der oben genannten Dateien zu codieren.

HINWEIS: Diese Liste ist veraltet, aber Sie können die veralteten Distributionen wie Mandrake leicht aus der Liste streichen und durch Alternativen ersetzen. Diese Art von Skript ist möglicherweise ein Ansatz, wenn Sie versuchen, eine Vielzahl von Solaris- und Linux-Varianten zu unterstützen.

Linux Mafia

Weitere Suchanfragen finden Sie auf der folgenden Seite unter Linuxmafia.com mit dem Titel: / etc / release equivalents für verschiedene Linux-Distributionen (und andere Unix-Distributionen) . Dies ist wahrscheinlich die umfassendste Liste, die ich bisher gesehen habe. Sie können diese Liste mit einer case / switch-Anweisung verschlüsseln und in Ihre Softwareverteilung aufnehmen.

Tatsächlich gibt es am Ende dieser Seite ein Skript, das genau das tut. Sie können das Skript also einfach herunterladen und als Drittanbieter für Ihre Softwareverteilung verwenden.

Skript

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

HINWEIS: Dieses Skript sollte vertraut aussehen, es ist eine aktuelle Version von Novell!

Skript zur Beinfreiheit

Eine andere Methode, die ich verwendet habe, besteht darin, ein eigenes Skript zu erstellen, ähnlich der obigen Novell-Methode, aber stattdessen LSB zu verwenden. Dieser Artikel mit dem Titel: Generische Methode zur Ermittlung des Linux- (oder UNIX-) Verteilungsnamens zeigt eine solche Methode.

# 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

Dieser Codeabschnitt könnte in die /etc/bashrcDatei eines Systems oder in eine solche Datei eingefügt werden, die dann die Umgebungsvariable setzt $DISTRO.

gcc

Ob Sie es glauben oder nicht, eine andere Methode ist es, davon Gebrauch zu machen gcc. Wenn Sie den Befehl abfragen, erhalten gcc --versionSie die Distribution, für die gcc erstellt wurde. Diese entspricht in jedem Fall dem System, auf dem es ausgeführt wird.

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;

Also welches sollte ich verwenden? Ich würde dazu tendieren, lsb_release -aLinux-Distributionen zu kaufen, die ich häufig verwenden würde (RedHat, Debian, Ubuntu usw.). In Situationen, in denen Sie Systeme unterstützen, die ich nicht zur Verfügung lsb_releasestelle, rolle ich meine eigene als Teil der Verteilung der von mir bereitgestellten Software, ähnlich einem der oben genannten Skripte.

UPDATE # 1: Follow-up mit SuSE

Im Gespräch mit @Nils in den Kommentaren unten wurde festgestellt, dass SLES11 aus irgendeinem Grund die Installation von LSB standardmäßig eingestellt hat. Es war nur eine optionale Installation, die für ein Paket, das diese Art von Schlüsselfunktion bietet, als kontraproduktiv erschien.

Deshalb habe ich die Gelegenheit genutzt, jemanden aus dem OpenSuSE-Projekt zu kontaktieren, um herauszufinden, warum.

Auszug aus der 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

Hier ist Robs Antwort

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
quelle
1
Hinweis: Wir haben gerade eine schnelle Überprüfung von Computern mit AIX und SunOS durchgeführt. Sie scheinen lsb_release nicht installiert zu haben (und immerhin ist dies kein Linux-Stapel, sondern Unix). Das Problem mit gcc ist, dass einige Leute jetzt anfangen, clang zu benutzen. Sie können auch nie sicher sein, welches gcc zum Erstellen verwendet wurde (auf Systemen, mit denen ich arbeite, gibt es auf jedem mindestens wenige Versionen). Mein Votum geht also an die Python-Lösung, da sie nun standardmäßig überall installiert zu sein scheint.
Elmo
@elmo - ja, LSB ist Linux Standard Base, daher würde ich weder von AIX noch von SunOS erwarten, dass es vorhanden ist. Meine Erfahrung mit SunOS beträgt mehr als 15 Jahre, und die Mehrheit der Anbieter, mit deren Software ich gearbeitet habe, stellt normalerweise ein eigenes Shell-Skript zur Verfügung, das dem oben genannten ähnelt. Bis Solaris 11 war Python keine Option. Und das macht es schwierig, eine Nuss zu knacken. Was tun Sie, wenn Sie Software bereitstellen, die unter Solaris 9, 10, 11, AIX und einigen Linux-Distributionen (SUSE, Ubntu und RHEL) ausgeführt werden muss? Python ist keine Option, daher bleibt Ihnen ein handcodiertes Shell-Skript übrig.
slm
@elmo - gcc, eine Option, scheint mir auch nicht so anziehend zu sein. Es scheint mit zu vielen Problemen behaftet zu sein, ich habe es nur als Option demonstriert.
slm
@elmo - Sehen Sie sich den Code hinter dieser Funktion an: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Es ist eine große Überraschung, dass es LSB verwendet!
slm
@slm: Ich habe Zugriff auf einen Computer mit SunOS 5.10 (von dem ich annehme, dass er 10 in Ihrer Liste enthält - ich kenne die Versionsnummern / Konventionen von Sun nicht so gut) und er verfügt über Python. Ich habe Zugriff auf Computer mit AIX 7 und es hat Python. Linux-Rechner haben es offensichtlich auch. Python scheint also immer noch die tragbarste Wahl zu sein. Was Sun unter 10 angeht, bin ich mir nicht sicher, warum Python nicht installiert werden kann (zugegebenermaßen fehlt die aktuelle Installation, dh es gibt keine Curses und Ctypes, also wer weiß?). Bei Python mit LSB ist es für Linux nicht verwunderlich, wenn es sich um einen Standardansatz handelt.
Elmo
16

Da Sie wahrscheinlich nicht in der Lage sind, facterauf einem Remote-Server zu installieren , können Sie nachvollziehen, wie der Name des Betriebssystems ermittelt wird. Den Ruby-Code dafür operatingsystemfinden Sie hier auf Pastebin . Grundsätzlich werden die verschiedenen *-releaseDateien und andere Dateien durchsucht, um den Namen des Betriebssystems zu ermitteln.

Einige der Dateien, die es betrachtet:

/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

Es tut mir leid, wenn Sie in dieser Liste Duplikate finden, ich habe sie schnell mit erstellt grep. Sollte ziemlich einfach (wenn auch etwas mühsam) sein, dies auf ein POSIX-Shell-Skript zu portieren.

Joseph R.
quelle
5
"Es tut mir leid, wenn Sie in dieser Liste Duplikate finden, ich habe es schnell mit grep erstellt." ... | uniq?
new123456
@ new123456 Richtig. Vielen Dank. Das Schlüsselwort hier ist "schnell" :)
Joseph R.
Tut mir leid, dass ich das nicht akzeptiere, aber die Antwort von @ slm ist einfach zu umfassend, um sie zu ignorieren :).
Terdon
3
Was ist mit / etc / os-release?
Yauhen Yakimovich
1
@ new123456 Technisch sollte das sein ... | sort -u. uniqfindet nur benachbarte eindeutige Elemente.
Parthian Shot
9

Falls Sie pythoninstalliert haben (egal ob Python 3 oder Python 2), können Sie den Distributionsnamen herausfinden, ohne das Rad neu zu erfinden :

python -c "import platform;print(platform.linux_distribution()[0])"
heinrich5991
quelle
Wenn Sie versucht sind, diese Option zu verwenden, stellen Sie sicher, dass Ihr Betriebssystem unterstützt wird: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Wenn nicht, können Sie der Liste weitere hinzufügen: coderwall.com/p/cwrenq
slm
1
Dies funktioniert nicht mit alten Linux-Distributionen. Zum Beispiel: SuSE 7.0 hatte Python 1.5.2 und das Plattformmodul wurde nicht vor dem Aufkommen von Python 2.3 im Jahr 2003 hinzugefügt
;-)
6

/etc/issuesollte die Release-Informationen enthalten. Ich bin ziemlich sicher, dass ich es auf Solaris-Systemen gesehen habe. Hier ist die Datei von einem modernen Debian-System:

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

$ 

/ etc / issue wird auch im FHS erwähnt (was nicht nur für Linux-Systeme gilt), obwohl es "optional" ist.

Drewbenn
quelle
Ah, das ist ein guter Vorschlag, +1. Es mag jedoch nicht immer funktionieren. The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.Es scheint dem Systemadministrator überlassen zu sein, zu schreiben, was er / sie möchte.
Terdon
2
/etc/issueist völlig unzuverlässig. (Ich sehe Systeme in Version XY mit einem /etc/issueBanner, das besagt, dass sie nach einem schlechten Patch-Management YZ waren. Es kann absolut alles enthalten.)
Mat
Es wird empfohlen, diese Datei mit zu füllen. legale Sachen wie wer sich einloggen darf.
Nils
Empfohlen von Sicherheitsrichtlinien und Auditoren. Es gab einmal einen Rechtsstreit, in dem ein Hacker ungestraft davonkam, weil es WILLKOMMEN in / etc / issue
Nils
@drewbenn Die Manpage sagt, was ich in meinem ersten Kommentar zitiert habe, es gibt nichts, woran es liegt, dass es die Systeminformationen enthalten muss. Das tut es einfach oft.
Terdon
6

Sie können den Namen der Distribution nicht zuverlässig in allen Distributionen mit einem einzigen Befehl ermitteln. Einige sind über / etc / * - release verfügbar, andere über den Befehl 'lsb-release'.

boz
quelle
Danke, aber auch nicht, wenn es um Unix oder ein anderes Nicht-Linux * nix geht.
terdon
3

Ich habe diesen Shell-Befehl verwendet, um eine Zeichenfolge abzurufen, die die Linux-Distribution angibt:

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;

Dieser Befehl basiert auf Antworten von Joseph R. und SLM.

Es sucht nur nach Dateien wie / etc / {osname} -release oder / etc / {osname} _version und gibt einen bestimmten os-Namen aus.

Es hat funktioniert

  • CentOS (Centos)
  • RedHat (RedHat)
  • Debian (debian)
  • Bogen (Bogen)
  • OpenSUSE (OpenSUSE)
  • Fedora (Fedora)
  • Ubuntu (Debian)
scrutari
quelle
Würde das nicht for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; donebei allen gleich gut funktionieren? Ich verstehe nicht, warum Sie zuerst findalle Dateien in /etc.
Terdon
Vielen Dank für Ihr Feedback, terdon, aber Ihr Befehl gibt 0 Zeilen in mindestens Cent OS und Fedora
scrutari
1

SNMP ist ein allgegenwärtiges Protokoll, das in vielen verschiedenen Arten von GNU / Linux-Distributionen und UNIX-Systemen zu finden ist.

Das system.sysDescr.0Objekt in der SNMPv2-MIB können Sie ermitteln , welches Betriebssystem Sie kontaktieren, vorausgesetzt , es ist ein SNMP - Daemon im Zielsystem ausgeführt wird :

Beschreibung

Eine Textbeschreibung der Entität. Dieser Wert sollte den vollständigen Namen und die Versionsidentifikation des Hardwaretyps, des Software-Betriebssystems und der Netzwerksoftware des Systems enthalten.

Status: aktuell

Zugriff: schreibgeschützt

In der snmpget(1)Manpage wird anhand von Beispielen erläutert, wie dieser Wert abgerufen wird.

Dawud
quelle
Nachteil ist, dass dies eine statische Zeichenfolge ist, die nicht automatisch verwaltet wird.
Nils
1

Da dies nicht allgemein möglich ist, haben wir über den Befehl snmp exec einen Release-String definiert.

Die Aufgabe dieses Befehls ist es, die Distribution und die aktuelle Haupt- / Nebenversion des Betriebssystems auszudrucken.

Auf RH und Clones parsen wir / etc / redhat-release, auf SuSe SuSe-release ...

Nils
quelle
Wer ist wir'? Und wie wäre es mit Unix?
Terdon
@terdon wir sind unser team bei der arbeit. Unter Unix können Sie dasselbe tun, wenn die entsprechende Erweiterung in snmpd kompiliert ist.
Nils
Ah, ich dachte du wärst Teil einer Standardgruppe :)
terdon
@terdon Sie beginnen mit der Entwicklung von Site-Standards, wenn Sie mehr als 80 Server verwalten müssen. Wir haben diese Methode entwickelt, um zu überwachen, ob das Betriebssystem veraltet ist (EoL Minor oder sogar Major Number)
Nils
1

Nach dem, was ich aus diesem Thread herausgefunden habe, sollten Sie in der Lage sein, die Informationen von verdammt nahen Systemen abzurufen, die Folgendes verwenden:

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
quelle
2
Analysiere nicht die Ausgabe von ls!
heinrich5991
@ heinrich5991 warum nicht?
Sammitch
Technisch betrachtet analysiert er nicht die Ausgabe von ls. Er lexiert die Ausgabe von ls. Aber ja ... Das ist falsch, weil /etc/issuees völlig unzuverlässig ist. Völlig völlig unzuverlässig. Auch Ihre Annahme, dass niemand eine nicht mit dem Betriebssystem zusammenhängende Datei mit der Endung 'release' oder 'version' ablegen könnte, ist unklug.
Parthian Shot
@ParthianShot Sie möchten sich also hauptsächlich über die zweite und dritte Ebene des Fallbacks beschweren, falls die zuverlässigeren Optionen nicht verfügbar sind?
Sammitch
@Sammitch more reliable optionsNun, zum einen gibt es nur eine Option. Selbst wenn ich Ihrer Annahme zustimme, dass es zuverlässiger ist (was ich nicht tue), sollten wir nicht damit beginnen, Dinge zu pluralisieren. Zweitens würde jemand, der Ihre Lösung tatsächlich verwendet hat und die Hälfte der Zeit völlig gescheitert ist, nicht von der Tatsache getröstet sein, dass sie in einem "sonst wenn" gescheitert ist. Keines meiner Systeme lsbwurde standardmäßig installiert.
Parthian Shot
1

Wenn eine Situation dies erfordert, können Sie dies mit snmpwalk [oder dem SNMP-Protokoll im Allgemeinen] aus der Ferne herausfinden. Ein Beispiel ist unten:

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

Der Schlüssel zur Zuverlässigkeit ist, ob SNMP in Ihrer Umgebung korrekt eingerichtet ist und ob auf allen Hosts snmp mit der richtigen Einrichtung für Community-Strings ausgeführt wird.

xpros
quelle
Was ist snpwalk? Wo kann ich es finden? Außerdem druckt das nur "Linux", keine Distributionsinformationen (was ich will, unamekann mir geben Linux). Funktioniert es auf Nicht-Linux-Betriebssystemen? Sagen wir unter UNIX oder BSD oder OSX?
Terdon
snmpwalk ist ein Linux-Befehlszeilenprogramm. Es gibt nicht nur "Linux" aus, sondern auch die Kernel-Version, die wirklich das einzige ist, was Sie brauchen. Wenn SNMP auf Ihren anderen Hosts konfiguriert ist, funktioniert snmpwalk wie gewohnt (v1 | v2c | v3), unabhängig davon, ob es sich um UNIX, BSD, OSX handelt, und sogar auf Windows-Hosts. Siehe auch snmpget oder snmpgetnext.
Xpros
Klingt gut, aber können Sie bitte Ihre Antwort bearbeiten und erklären, wo wir sie finden können. Es ist zum Beispiel nicht in den Debian-Repos. Erklären Sie auch, was es gibt, uname -aund wie es mir den Namen der Distribution mitteilen kann, um die es in dieser Frage geht. Selbst wenn diese Informationen zurückgegeben werden können, da es sich um ein nicht standardmäßiges Dienstprogramm handelt, das installiert werden muss, bin ich mir nicht sicher, ob es hier nützlich wäre. Die Idee ist, sich bei einem Remote-System anzumelden und das Betriebssystem (einschließlich der Distribution, wenn es sich um Linux handelt) herauszufinden.
Terdon
it also prints the kernel version which is really the only thing you needAber ... das ist der springende Punkt dieser Frage. Wenn das wirklich alles war, was du brauchst, könntest du es einfach benutzen uname -a. Der Kernel ist ein wichtiger Bestandteil eines Betriebssystems, aber nicht das gesamte Betriebssystem. Dateisystemlayout und Userland-Dienstprogramme (z. B. Paketmanager) sind wichtig.
Parthian Shot
1

Verwendung /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

Die Gründe werden in einer FAQ durch einen von @weberjn in diesem Kommentar zur Verfügung gestellten Link http://0pointer.de/blog/projects/os-release.html gut erklärt . Ich führe hier nur ein Argument gegen die Verwendung der oben genannten Antwort aus dem Jahr 2013 auf.lsb_release

Dafür gibt es bereits das Tool lsb_release. Warum verwenden Sie das nicht einfach?Nun, es ist eine sehr seltsame Oberfläche: ein Shell-Skript, das Sie aufrufen müssen (und das daher asynchron aus Ihrem C-Code hervorgeht) und das nicht als erweiterbar geschrieben wurde. Es ist ein optionales Paket in vielen Distributionen und nichts, was wir gerne im Rahmen eines frühen Startvorgangs aufrufen würden, um eine Willkommensnachricht anzuzeigen. (In Zeiten mit Boot-Zeiten im Subsekundenbereich möchten wir wirklich kein großes Shell-Skript aufrufen, um Trivialitäten wie das Anzeigen der Begrüßungsnachricht zu vermeiden.) Das Tool lsb_release scheint uns ein Versuch zu sein, Verteilungsprüfungen zu abstrahieren, bei denen eine Standardisierung der Verteilungsprüfungen erforderlich ist. Es ist einfach eine schlecht gestaltete Oberfläche. Unserer Meinung nach dient es als Schnittstelle zur Ermittlung der LSB-Version selbst, jedoch nicht zur Überprüfung der Distribution oder Version.

anatoly techtonik
quelle
Danke, aber die akzeptierte Antwort spricht dies bereits im Zitat am Ende an, was erklärt, dass dies /etc/os-releasemehr zum Standard werden wird. Diese Datei ist jedoch nicht immer auf allen Systemen vorhanden, weshalb die akzeptierte Antwort portablere Alternativen bietet. Auch ich weiß nicht , warum Sie C - Code sind zu erwähnen, ist die Frage nicht über alles von C. Aufruf
terdon
@terdon Ich bin nur gespannt, welche Systeme im Jahr 2018 wo /etc/os-releasefehlen? Ich vermute, dass ihre Nutzerbasis im Vergleich zu Systemen, die lsb_releasenicht standardmäßig ausgeliefert werden, miserabel ist. Zumindest konnte ich Ihre akzeptierte Antwort auf Fedora nicht verwenden. Was den C-Kommentar systemdbetrifft , so ist es nicht mein, sondern ein von mir angegebener Link von 0pointer.de.
anatoly techtonik
Ja, ich weiß, dass es nicht deins ist. Ich habe mich nur gefragt, warum Sie das Gefühl haben, dass ein Zitat über C-Code relevant ist. Und soweit ich weiß, os-releasehandelt es sich meistens oder ausschließlich um eine Linux-Sache. Es scheint von FreeDesktop.org definiert zu sein, daher wird es möglicherweise auch von einigen Unix-Versionen verwendet, aber ich bezweifle, dass Sie es in den meisten oder in eingebetteten Systemen oder in anderen Systemen ohne grafische Benutzeroberfläche usw. finden Verwenden Sie aus Stabilitätsgründen immer noch sehr alte Maschinen.
Terdon
Das Zitat handelt von lsb_releaseund Sie können C durch Go ersetzen und das gleiche Argument erhalten. Der Aufwand für die Ausführung lsb_releaseist sowohl unter Sicherheits- als auch unter Leistungsaspekten wesentlich höher als das einfache Analysieren statischer Dateien. Ich glaube nicht an sehr alte Maschinen, die für Stabilität sorgen. Heartbleed und Freunde hätten sie schon längst /etc/os-release
wegbringen sollen