Wie kann man mithilfe eines Bash-Skripts feststellen, ob die aktuelle Plattform Ubuntu oder CentOS ist?

39

Ich kenne die Befehle, um den Namen des Linux-Computers zu überprüfen, der auf meinem Computer ausgeführt wird. Zum Beispiel:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

Wie erhalte ich die Ausgabe vom Terminal und vergleiche, ob es sich um UBUNTU oder CENTOS handelt, und führe die folgenden Befehle aus?

apt-get install updates 

oder

yum update

Ubuntu 14.04

cat /etc/issue
Shekhar
quelle
2
Willkommen bei Ask Ubuntu. Könnten Sie bitte etwas Zeit zum Lesen verwenden ? Was soll ich tun, wenn jemand meine Frage beantwortet?
Sylvain Pineau

Antworten:

53

Leider gibt es keine todsichere, einfache Möglichkeit, den Distributionsnamen zu ermitteln. Die meisten großen Distributionen gehen zu einem System über, in dem sie /etc/os-releasediese Informationen speichern. Die meisten modernen Distributionen enthalten auch die lsb_releaseTools, diese werden jedoch nicht immer standardmäßig installiert. Hier sind einige Ansätze, die Sie verwenden können:

  1. Verwenden /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. Verwenden Sie die lsb_releaseWerkzeuge, falls verfügbar

    lsb_release -d | awk -F"\t" '{print $2}'
  3. Verwenden Sie ein komplexeres Skript, das für die meisten Distributionen geeignet ist:

    # 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
    
  4. Analysieren Sie die Versionsinformationen von, gccfalls installiert:

    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.
    

    Ubuntu 14.04

    $ gcc --version
    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
    Copyright (C) 2013 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

Dies wurde im Grunde direkt von @ slms großartiger Antwort auf meine Frage hier kopiert .

terdon
quelle
"Leider gibt es keine todsichere, einfache Möglichkeit, den Distributionsnamen zu ermitteln." <— Dies ist überhaupt nicht der Fall. Sylvain Pineau zeigte zum Beispiel einen trivialen Einzeiler, der den aktuellen Plattformtyp zuverlässig abfragt, indem er auf Python zurückgreift - das auf den meisten Plattformen (einschließlich Ubuntu) vorinstalliert ist. Shell-Skripte sollten niemals versuchen, Plattform-Metadaten mit einfachen, nicht portierbaren Tests der in dieser Antwort implementierten Art manuell abzufragen.
Cecil Curry
Gawk ist standardmäßig nicht in Debian installiert.
Ville Laitila
@ VilleLaitila Ich fürchte, das ist hier nicht relevant, da es auf dieser Seite nur um Ubuntu geht. Aber es gibt hier nichts Gawk-spezifisches, so awkoder so eine mawkandere Implementierung würde genauso gut funktionieren.
Terdon
Noch genauer unter Verwendung von lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode
@NerdOfCode Wenn Sie nur die Versionsnummer möchten, tun Sie lsb_release -d | awk '{print $3}'oder grep -oP 'VERSION="\K\S+' /etc/os-release, es ist nicht erforderlich, dass sich die Doppelpfeife bewegt.
Terdon
25

Sie brauchen bash nicht, um eine solche Aufgabe zu erledigen, und ich würde vorschlagen, einen High-Level-Ansatz zu verwenden, um den Umgang mit Dateien wie /etc/versionund zu vermeiden /etc/issue(ich habe / etc / version in 13.10 nicht).

Meine Empfehlung lautet daher, stattdessen diesen Befehl zu verwenden:

python -mplatform | grep -qi Ubuntu && sudo apt-get update || sudo yum update

Das Python- Plattform- Modul funktioniert auf beiden Systemen. Der Rest des Befehls prüft, ob Ubuntu von Python zurückgegeben wird, und startet apt-getandernfalls yum.

Sylvain Pineau
quelle
hinzufügen -izu grephelfen können.
Coanor
8

Hier ist eine einfache Antwort, die meines Erachtens für alle Versionen von Ubuntu / CentOS / RHEL durch das bloße Vorhandensein der Dateien funktioniert (natürlich nicht ausfallsicher, wenn jemand nach dem Zufallsprinzip / etc / redhat-release auf Ihre Ubuntu-Boxen legt usw.):

if [ -f /etc/redhat-release ]; then
  yum update
fi

if [ -f /etc/lsb-release ]; then
  apt-get update
fi
Adam
quelle
Auf meinem Ubuntu gibt es keine / etc / lsb-Veröffentlichung
noonex
3
Ich gehe nicht auf -1, aber diese Antwort ist in mindestens einem Fall nicht korrekt: /etc/lsb-releaseExistiert unter CloudLinux (CentOS) 6.8 und gibt daher beide yumund zurück apt-get.
Dhaupin
5

Benutze Chef für diese Aufgaben. ;-)

In Chef können Sie die platform?Methode verwenden:

if platform?("redhat", "centos", "fedora")
  # Code for only Red Hat Linux family systems.
end

Oder:

if platform?("ubuntu")
  # Code for only Ubuntu systems
end

Oder:

if platform?("ubuntu")
  # Do Ubuntu things
end

Oder:

if platform?("freebsd", "openbsd")
  # Do BSD things
end
user1323
quelle
1
Während nachweislich überlegen Low-Level - Shell-centric fragile nicht-Lösungen (zB lsb_release, /etc/os-release), diese Lösung den entscheidenden Nachteil, dass Chef hat - ein Schwergewicht Infrastructure as - Code (IAC) Rahmen nicht standardmäßig installiert auf den meisten Plattformen und erfordern den Einsatz von eine eigene domänenspezifische Sprache (DSL). Kurz gesagt, die meisten Benutzer möchten wahrscheinlich nur auf Python zurückgreifen , das standardmäßig auf den meisten Plattformen (einschließlich Ubuntu) installiert ist und sich gut mit Shell-Skripten kombinieren lässt.
Cecil Curry
5

Überprüfen Sie den Kernelnamen auf Ubuntu:

if [  -n "$(uname -a | grep Ubuntu)" ]; then
    sudo apt-get update && sudo apt-get upgrade 
else
    yum update
fi  
Harris
quelle
4
 apt-get -v &> /dev/null && apt-get update
 which yum &> /dev/null && yum update

Wenn es nur zwei Distributionen gibt, können Sie sie kürzer machen:

apt-get -v &> /dev/null && apt-get update || yum update

Irgendwie wird yum -vin CentOS ein Wert ungleich Null zurückgegeben. Verwenden Sie whichstattdessen.
Natürlich sollten Sie das Szenario in Betracht ziehen, wenn es kein whichinstalliertes gibt.

Chang Land
quelle
2

Das folgende Skript sollte zeigen, ob es sich um Ubuntu handelt. Wenn dies nicht der Fall ist und die einzige andere Option, die Sie haben, CentOS ist, sollten Sie sie in einer elseKlausel haben:

dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi
Job in
quelle
1
Dies kann wahrscheinlich mit dem lsb_releaseTool vereinfacht werden , das dieselben Dateien auslesen sollte. lsb_release -iBerichte entweder Distributor ID: Ubuntuoder Distributor ID: CentOSin diesen Fällen.
Chronitis
@chronitis: ja, sicher kann es sein
jobin
Ich denke nicht, dass es standardmäßig auf Centos verfügbar ist
Sylvain Pineau
1

Führen Sie /etc/os-releasein einer Sub-Shell aus und geben Sie den Wert zurück:

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi
jobwat
quelle
0

Ich würde Python verwenden

if ! python -c "exec(\"import platform\nexit ('centos' not in platform.linux_distribution()[0].lower())\")" ; then
   echo "It is not CentOS distribution, ignoring CentOS setup"
   exit 0
fi
Kann Tecim
quelle
0

Dieser Befehl funktioniert unter CentOS, Ubuntu und Debian: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

In Debian gibt es nach Debian GNU/Linux, in Ubuntu gibt es nach Ubuntuund in CentOS gibt es nach CentOS Linux.

Der Vorteil der Verwendung von grep, cut und sed anstelle von gawk liegt auf der Hand: In Debian ist gawk nicht standardmäßig installiert, so dass Sie sich nicht auf eine zufällige Debian-Box verlassen können.

Ville Laitila
quelle