it-swarm.com.de

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

Angenommen, ich bin bei einem Remote-System angemeldet. Wie kann ich wissen, was ausgeführt wird? Unter den meisten modernen Linuxes (Linuces?) Haben Sie den Befehl lsb_release:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Was, soweit ich das beurteilen kann, nur die gleichen Informationen wie /etc/lsb-release Gibt. Was ist, wenn diese Datei nicht vorhanden ist? Ich erinnere mich anscheinend, dass der Befehl lsb_release Relativ neu ist. Was ist, wenn ich das Betriebssystem eines älteren Systems herunterladen muss?

In jedem Fall steht lsb für Linux Standard Base, Daher gehe ich davon aus, dass es auf Nicht-Linux-Unices nicht funktioniert. Soweit ich weiß, gibt es keine Möglichkeit, diese Informationen von uname abzurufen. Wie kann ich sie auf Systemen abrufen, die nicht lsb_release Verwenden?

70
terdon

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

Geschichte des LSB

Das lsb in diesem Befehl steht für das Projekt Linux Standards Base , ein von Linux Foundation gesponsertes Dachprojekt, um generische Methoden für grundlegende Arten von Dinge auf verschiedenen Linux-Distributionen.

Das Projekt ist freiwillig und Anbieter können nur als Benutzer und als Vermittler der verschiedenen Spezifikationen für verschiedene Module am Projekt teilnehmen, um die Standardisierung innerhalb der verschiedenen Linux-Distributionen voranzutreiben.

Auszug aus dem Charter

Die LSB-Arbeitsgruppe hat sich zum Ziel gesetzt, diese beiden Probleme anzugehen. Wir veröffentlichen in Absprache mit den wichtigsten Distributionsanbietern einen Standard, der die Mindestanzahl von APIs beschreibt, die eine Distribution unterstützen muss. Wir bieten auch Tests und Tools, die die Unterstützung des Standards messen und es Anwendungsentwicklern ermöglichen, auf die gemeinsame Gruppe abzuzielen. Schließlich versuchen wir durch unsere Testarbeit, unnötige Abweichungen zwischen den Verteilungen zu vermeiden.

Nützliche Links zu LSB

Kritik

Es gibt eine Reihe von Problemen mit LSB, die es für Distributionen wie Debian problematisch machen. Die erzwungene Verwendung von RPM ist eins. Siehe Wikipedia-Artikel für mehr zu diesem Thema .

Novell

Wenn Sie suchen, werden Sie möglicherweise auf eine ziemlich veraltet aussehende Seite mit dem Titel: Erkennung der zugrunde liegenden Linux-Distribution von Novell stoßen. Dies ist einer der wenigen Orte, an denen ich eine aktuelle Liste gesehen habe, die einige der wichtigsten Distributionen zeigt und wie Sie erkennen 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

Dieselbe Seite enthält auch ein praktisches Skript, das versucht, das oben Genannte nur mit Vanilla uname-Befehlen und dem Vorhandensein einer der oben genannten Dateien zu codieren.

HINWEIS: Diese Liste ist veraltet, aber Sie können die datierten Distributionen wie Mandrake leicht aus der Liste streichen und durch Alternativen ersetzen. Diese Art von Skript kann ein Ansatz sein, wenn Sie versuchen, eine große Anzahl 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-Entsprechungen für verschiedene Linux- (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 kodifizieren 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 des Novell!

Legroom-Skript

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: Allgemeine Methode zum Bestimmen 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/bashrc Oder eine solche Datei eines Systems aufgenommen werden, die dann die Umgebungsvariable $DISTRO Setzt.

gcc

Ob Sie es glauben oder nicht, eine andere Methode besteht darin, gcc zu verwenden. Wenn Sie den Befehl gcc --version Abfragen, erhalten Sie die Distribution, für die gcc erstellt wurde. Diese ist immer dieselbe wie das System, auf dem sie 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;

Welches sollte ich also verwenden? Ich würde dazu neigen, lsb_release -a Für alle Linux-Distributionen zu verwenden, die ich häufig verwenden würde (RedHat, Debian, Ubuntu usw.). In Situationen, in denen Sie Systeme unterstützen, die nicht lsb_release Bereitstellen, würde ich meine eigenen als Teil der von mir bereitgestellten Softwareverteilung rollen, ä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 standardmäßige Installation von LSB zu verhindern schien. Es war nur eine optionale Installation, die einem Paket, das diese Art von Schlüsselfunktion bietet, widersprach.

Ich nutzte die Gelegenheit, um jemanden aus dem OpenSuSE-Projekt zu kontaktieren, um ein Gefühl dafür zu bekommen, warum.

E-Mail-Auszug

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 
74
slm

Da Sie facter wahrscheinlich nicht auf einem Remote-Server installieren können, können Sie nachahmen, wie der Betriebssystemname ermittelt wird. Der Ruby Code für die operatingsystem Tatsache kann gefunden werden hier auf Pastebin . Grundsätzlich sieht er durch die verschiedenen *-release Dateien und andere, um den Betriebssystemnamen zu bestimmen.

Einige der Dateien, die es sich ansieht:

/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 Duplikate in dieser Liste finden. Ich habe sie schnell mit grep erstellt. Sollte ziemlich einfach (wenn auch etwas mühsam) sein, dies auf ein POSIX-Shell-Skript zu portieren.

16
Joseph R.

Falls Sie python installiert 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])"
9
heinrich5991

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

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

$ 

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

6
user4443

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

6
boz

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 den Antworten von Joseph R. und slm.

Es wird nur nach Dateien wie/etc/{osname} -release oder/etc/{osname} _version gesucht und ein bestimmter os-Name gedruckt.

Es hat funktioniert

  • CentOS (Centos)
  • RedHat (Redhat)
  • Debian (debian)
  • Bogen (Bogen)
  • OpenSUSE (OpenSUSE)
  • Fedora (Fedora)
  • Ubuntu (Debian)
4
scrutari

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

Mit dem Objekt system.sysDescr.0 in SNMPv2-MIB können Sie herausfinden, mit welchem ​​Betriebssystem Sie Kontakt aufnehmen, sofern auf dem Zielsystem ein SNMP-Daemon 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 Manpage snmpget(1) wird anhand von Beispielen erläutert, wie dieser Wert abgerufen wird.

1
dawud

Da dies nicht üblich ist, haben wir einen Release-String über den Befehl snmp exec-command definiert.

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

Auf RH und Klonen analysieren wir/etc/redhat-release, auf SuSe SuSe-release ...

1
Nils

Verwenden /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 einem FAQ durch einen Link http: //0pointer.de/blog/projects/os-release.html erklärt, der von = kostenlos zur Verfügung gestellt wird @ weberjn in dieser Kommentar . Ich liste hier nur ein Argument gegen die Verwendung von lsb_release das ist bis jetzt die am besten bewertete Antwort von 2013.

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 daher asynchron aus Ihrem C-Code erzeugen), und es ist nicht so geschrieben, dass es erweiterbar ist. Es ist ein optionales Paket in vielen Distributionen und nichts, was wir gerne als Teil des frühen Startvorgangs aufrufen würden, um eine Willkommensnachricht anzuzeigen. (In Zeiten mit Startzeiten im Benutzerbereich von weniger als einer Sekunde möchten wir wirklich kein riesiges Shell-Skript aufrufen, um eine Kleinigkeit wie das Anzeigen der Begrüßungsnachricht zu erreichen.) 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 wird es als Schnittstelle verwendet, um die LSB-Version selbst zu bestimmen, nicht jedoch, um die Distribution oder Version zu überprüfen.

1

Nach dem, was ich aus diesem Thread gelernt habe, sollten Sie in der Lage sein, die Informationen von verdammt jedem System zu erhalten, indem Sie:

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
1
Sammitch

Wenn eine Situation dies erfordert, können Sie dies mithilfe von 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 Sa Sep 14 05:32:37 EDT 2013 x86_64

Der Schlüssel zur Zuverlässigkeit liegt darin, ob SNMP in Ihrer Umgebung korrekt eingerichtet ist. Auf allen Hosts wird snmp mit der richtigen Einrichtung der Community-Zeichenfolgen ausgeführt.

1
xpros