GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erhalte ich zuverlässig den Namen des Betriebssystems?

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

Geschichte von LSB

Die lsb in diesem Befehl steht für das Projekt Linux Standards Base, ein von der Linux Foundation gesponsertes Dachprojekt, das generische Methoden zur Verfügung stellt, um grundlegende Dinge auf verschiedenen Linux-Distributionen zu tun.

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

Auszug aus der Satzung

Die LSB-Arbeitsgruppe hat als Kernziel die Behandlung dieser beiden Anliegen. In Absprache mit den wichtigsten Distributionsanbietern veröffentlichen wir einen Standard, der den Mindestsatz an APIs beschreibt, die eine Distribution unterstützen muss. Wir stellen auch Tests und Tools zur Verfügung, die die Unterstützung des Standards messen, und ermöglichen es Anwendungsentwicklern, auf den gemeinsamen Satz abzuzielen. Schließlich versuchen wir durch unsere Testarbeit, unnötige Abweichungen zwischen den Distributionen zu vermeiden.

Nützliche Links zu LSB

  • LSB-Charta
  • LSB-Arbeitsgruppe
  • LSB-Roadmap
  • LSB-Mailingliste (aktuelle Aktivität ist hier!)
  • Liste zertifizierter LSB-Produkte
  • LSB-Wikipedia-Seite

Kritik

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

Novell

Wenn Sie suchen, werden Sie möglicherweise auf eine ziemlich veraltet aussehende Seite mit dem Titel stoßen:Detecting Underlying Linux Distro from Novell. Dies ist einer der wenigen Orte, an denen ich eine aktuelle Liste gesehen habe, die mehrere 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 Obige zu kodieren, indem es einfach Vanilla uname verwendet Befehle und das Vorhandensein einer der oben genannten Dateien.

HINWEIS: Diese Liste ist veraltet, aber Sie könnten die veralteten Distributionen wie Mandrake leicht aus der Liste streichen und durch Alternativen ersetzen. Diese Art von Skript könnte ein Ansatz sein, wenn Sie versuchen, eine große Bandbreite von Solaris- und Linux-Varianten zu unterstützen.

Linux-Mafia

Wenn Sie weiter suchen, wird die folgende Seite auf Linuxmafia.com mit dem Titel auftauchen:/etc/release-Äquivalente für verschiedene Linux- (und andere Unix-) Distributionen. Dies ist wahrscheinlich die umfassendste Liste, die ich bisher gesehen habe. Sie könnten diese Liste mit einer case/switch-Anweisung kodifizieren und sie als Teil Ihrer Softwareverteilung hinzufügen.

Tatsächlich gibt es am Ende dieser Seite ein Skript, das genau das tut. Sie können das Skript also einfach als Drittanbieter für Ihre Softwareverteilung herunterladen und 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 Ihnen bekannt vorkommen, es ist eine aktuelle Version von Novell!

Beinfreiheitsskript

Eine andere Methode, die ich gesehen 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 zur Bestimmung des Linux- (oder UNIX-) Distributionsnamens 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 den /etc/bashrc eines Systems eingefügt werden oder eine solche Datei, die dann die Umgebungsvariable $DISTRO setzen würde .

gcc

Ob Sie es glauben oder nicht, eine andere Methode ist die Verwendung von gcc . Wenn Sie den Befehl gcc --version abfragen Sie erhalten die Distribution, für die gcc gebaut wurde, die ausnahmslos mit dem System identisch ist, auf dem es läuft.

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 eher zu lsb_release -a gehen für alle Linux-Distributionen, die ich häufig verwenden würde (RedHat, Debian, Ubuntu usw.). Für Situationen, in denen Sie Systeme unterstützen, die lsb_release nicht bereitstellen Ich würde mein eigenes als Teil der Verteilung der von mir bereitgestellten Software rollen, ähnlich wie eines 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, was für ein Paket, das diese Art von Schlüsselfunktion bietet, kontraproduktiv erschien.

Also nutzte ich die Gelegenheit, um jemanden vom OpenSuSE-Projekt zu kontaktieren, um ein Gefühl dafür zu bekommen, warum.

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

Da Sie facter wahrscheinlich nicht installieren können Auf einem Remote-Server können Sie nachahmen, was er tut, um den Namen des Betriebssystems zu finden. Der Ruby-Code für operatingsystem Tatsache finden Sie hier auf Pastebin. Grundsätzlich durchsucht es die verschiedenen *-release Dateien und andere, 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 Duplikate in dieser Liste finden, ich habe sie schnell mit grep erstellt . Sollte ziemlich einfach (wenn auch etwas mühsam) sein, dies in ein POSIX-Shell-Skript zu portieren.


Falls Sie python haben installiert (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])"

Linux
  1. Wie überprüfe ich das Installationsdatum Ihres Linux-Betriebssystems?

  2. Linux:Wie bekomme ich alle Anmeldeprotokolle vom System?

  3. Wie kann ich den temporären Ordner eines Computers abrufen, auf dem Maven ausgeführt wird?

  4. Wie erhalte ich Informationen zum Betriebssystem der Amazon EC2-Instanz?

  5. So erhalten Sie die aktuelle Monitorauflösung oder den Monitornamen (LVDS, VGA1 usw.)

So erhalten Sie die Größe eines Verzeichnisses in Linux

Wie bekomme ich die Skype-Benachrichtigung wieder in die Taskleiste?

Wo finde ich die erste Version des Linux-Betriebssystems?

Wie kann ich die Länge einer Videodatei von der Konsole abrufen?

Wenn ich die PID-Nummer eines Prozesses kenne, wie erhalte ich seinen Namen?

Wie kann ich die Uhrzeit eines laufenden Prozesses abrufen?