it-swarm.com.de

Wie kann ich den Distributionsnamen und die Versionsnummer in einem einfachen Shell-Skript erhalten?

Ich arbeite an einem einfachen Bash-Skript, das auf Ubuntu- und CentOS-Distributionen ausgeführt werden kann (Unterstützung für Debian und Fedora/RHEL wäre von Vorteil), und ich muss den Namen und die Version der Distribution kennen, die das Skript ausführt ( um bestimmte Aktionen auszulösen, z. B. das Erstellen von Repositorys). Bisher habe ich Folgendes:

OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
Arch=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')

if [ -z "$OS" ]; then
    OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi

if [ -z "$VERSION" ]; then
    VERSION=$(awk '{print $3}' /etc/*-release)
fi

echo $OS
echo $Arch
echo $VERSION

Dies scheint zu funktionieren und gibt ubuntu oder centos (ich habe andere nicht ausprobiert) als Versionsnamen zurück. Ich habe jedoch das Gefühl, dass es einen einfacheren und zuverlässigeren Weg geben muss, dies herauszufinden - stimmt das?

Bei RedHat funktioniert das nicht./etc/redhat-release enthält: Redhat Linux Entreprise Release 5.5

Die Version ist also nicht das dritte Wort. Verwenden Sie besser:

OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/redhat-release`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/redhat-release`
echo "RedHat/CentOS $OS_MAJOR_VERSION.$OS_MINOR_VERSION"
200
Alix Axel

Um OS und VER zu erhalten, scheint der neueste Standard /etc/os-release Zu sein. Davor gab es lsb_release Und /etc/lsb-release. Zuvor mussten Sie für jede Distribution nach unterschiedlichen Dateien suchen.

Folgendes würde ich vorschlagen

if [ -f /etc/os-release ]; then
    # freedesktop.org and systemd
    . /etc/os-release
    OS=$NAME
    VER=$VERSION_ID
Elif type lsb_release >/dev/null 2>&1; then
    # linuxbase.org
    OS=$(lsb_release -si)
    VER=$(lsb_release -sr)
Elif [ -f /etc/lsb-release ]; then
    # For some versions of Debian/Ubuntu without lsb_release command
    . /etc/lsb-release
    OS=$DISTRIB_ID
    VER=$DISTRIB_RELEASE
Elif [ -f /etc/debian_version ]; then
    # Older Debian/Ubuntu/etc.
    OS=Debian
    VER=$(cat /etc/debian_version)
Elif [ -f /etc/SuSe-release ]; then
    # Older SuSE/etc.
    ...
Elif [ -f /etc/redhat-release ]; then
    # Older Red Hat, CentOS, etc.
    ...
else
    # Fall back to uname, e.g. "Linux <version>", also works for BSD, etc.
    OS=$(uname -s)
    VER=$(uname -r)
fi

Ich denke, uname, um Arch zu bekommen, ist immer noch der beste Weg. Aber das Beispiel, das Sie gegeben haben, behandelt offensichtlich nur Intel-Systeme. Ich würde es entweder BITS so nennen:

case $(uname -m) in
x86_64)
    BITS=64
    ;;
i*86)
    BITS=32
    ;;
*)
    BITS=?
    ;;
esac

Oder ändern Sie Arch, um die gebräuchlichsten und dennoch eindeutigen Versionen zu sein: x86 Und x64 Oder ähnliches:

case $(uname -m) in
x86_64)
    Arch=x64  # or AMD64 or Intel64 or whatever
    ;;
i*86)
    Arch=x86  # or IA32 or Intel32 or whatever
    ;;
*)
    # leave Arch as-is
    ;;
esac

aber das liegt natürlich an dir.

194
Mikel

Ich würde dies als ersten Schritt tun:

ls /etc/*release

Gentoo, RedHat, Arch & SuSE haben eine Datei mit dem Namen z. /etc/gentoo-release. Scheint beliebt zu sein, überprüfen Sie diese Seite über Release-Dateien .

Debian & Ubuntu sollten einen /etc/lsb-release Haben, der auch Release-Informationen enthält und mit dem vorherigen Befehl angezeigt wird.

Eine andere schnelle ist uname -rv. Wenn der installierte Kernel der Standard-Distributionskernel ist, werden Sie meistens finde manchmal den Namen dort.

59
Mat

lsb_release -a. Funktioniert unter Debian und ich denke Ubuntu, aber ich bin mir über den Rest nicht sicher. Normalerweise sollte es in allen GNU/Linux-Distributionen vorhanden sein, da es sich um LSB (Linux Standard Base) handelt.

37
sakisk

Einzeiler, Fallbacks, eine Ausgabezeile, keine Fehler.

( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
24
Markus
python -m platform

beispielausgaben:

Ubuntu:

Linux-4.9.184-linuxkit-x86_64-with-Ubuntu-18.04-bionic

Debian:

Linux-4.14.117-grsec-grsec+-x86_64-with-debian-buster-sid

Centos:

Linux-3.10.0-957.1.3.el7.x86_64-x86_64-with-centos-7.6.1810-Core

Mac OS X:

Darwin-17.7.0-x86_64-i386-64bit

Siehe Plattformmodul-Dokumente , wenn Sie einen bestimmten Wert aus dieser Zeile benötigen. Wenn Sie beispielsweise nur den Namen der Linux-Distribution benötigen, verwenden Sie

python -c "import platform;print(platform.linux_distribution()[0])"
13
Ilya Kharlamov
  1. lsb- * ist nicht installiert/existiert nicht auf CentOS- oder Debian-Basissystemen
  2. / proc/* existiert unter OSX nicht

Nehmen Sie einen Tipp von Javascript-Entwicklern. Testen Sie nicht auf die Version, sondern auf die Fähigkeit. Es ist nicht schön, aber es funktioniert. Bei Bedarf erweitern.

function os_type
{
case `uname` in
  Linux )
     LINUX=1
     which yum && { echo centos; return; }
     which zypper && { echo opensuse; return; }
     which apt-get && { echo debian; return; }
     ;;
  Darwin )
     DARWIN=1
     ;;
  * )
     # Handle AmgiaOS, CPM, and modified cable modems here.
     ;;
esac
}  
9
Orwellophile

Für die meisten modernen Linux-Betriebssysteme ist die Datei /etc/os-release wird wirklich zum Standard und wird in den meisten Betriebssystemen verwendet. Sie können also einfach die Datei in Ihr Bash-Skript aufnehmen und haben Zugriff auf alle beschriebenen Variablen hier (zum Beispiel: NAME, VERSION, ...)

Ich verwende dies also nur in meinem Bash-Skript:

if [ -f /etc/os-release ]
then
        . /etc/os-release
else
        echo "ERROR: I need the file /etc/os-release to determine what my distribution is..."
        # If you want, you can include older or distribution specific files here...
        exit
fi
6
Chris Maes

In der Reihenfolge des wahrscheinlichsten Erfolgs sind diese:

cat /etc/*version
cat /proc/version #linprocfs/version for FreeBSD when "linux" enabled
cat /etc/*release
uname -rv

decken die meisten Fälle ab (AFAIK): Debian, Ubuntu, Slackware, Suse, Redhat, Gentoo, * BSD und vielleicht andere.

6
Eelvex

Wenn die Datei /etc/debian_version existiert, die Distribution ist Debian oder ein Debian-Derivat. Diese Datei hat möglicherweise eine Versionsnummer. auf meinem Rechner ist es derzeit 6.0.1. Wenn es getestet oder instabil ist, kann es heißen, dass es getestet/instabil ist, oder es kann die Nummer der kommenden Version haben. Mein Eindruck ist, dass diese Datei zumindest unter Ubuntu immer getestet/instabil ist und dass sie nicht die Versionsnummer enthält, aber jemand kann mich korrigieren, wenn ich falsch liege.

Fedora (zumindest aktuelle Versionen) hat eine ähnliche Datei, nämlich /etc/Fedora-release.

3
Faheem Mitha

Wenn Sie die LSB-Release-Datei nicht verwenden können oder wollen (aufgrund der Abhängigkeiten, die das Paket mit sich bringt), können Sie nach den distro-spezifischen Release-Dateien suchen. Bcfg2 hat eine Sonde für die Distribution, die Sie möglicherweise verwenden können: http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes /group.txt

2
jsbillings

2 Wege von vielen:

1) verwenden

lsb_release -a

Ich habe es unter CentOS 5.5 und Ubuntu 10.04 getestet

die Ausgabe für CentOS lautet:

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch 
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

und für Ubuntu ist:

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

2) Geben Sie den folgenden Befehl ein:

cat /etc/*-release

Ich habe es unter CentOS 5.5 und Ubuntu 10.04 getestet und es funktioniert einwandfrei.

1
Sam

Ich finde ein gutes Skript von hier , das für die meisten gängigen Linux-Dists funktioniert:

#! /bin/bash
# return an awkable string consisting of
#    unix OS type, or
#    Linux dist, or
#    a long guess (based on /proc), or
#    no clue

giveUp () {
   echo "Unknown"
   exit 0
}

# keep this easily awkable, prepending an initial clue
versionGuess () {
   if [ -e /proc/version ]; then
      echo -n "Unsure "
      cat /proc/version
      exit 0
   fi
   return 1
}

# if we have ignition, print and exit
gotDist () {
   [ -n "$1" ] && echo "$1" && exit 0
}

# we are only interested in a single Word "dist" here
# various malformations can occur; admin will have to code appropately based on output
linuxRelease () {
   if [ -r /etc/lsb-release ]; then
      dist=$(grep 'DISTRIB_ID' /etc/lsb-release | sed 's/DISTRIB_ID=//' | head -1)
      gotDist "$dist"
   fi

   dist=$(find /etc/ -maxdepth 1 -name '*release' 2> /dev/null | sed 's/\/etc\///' | sed 's/-release//' | head -1)
   gotDist "$dist"

   dist=$(find /etc/ -maxdepth 1 -name '*version' 2> /dev/null | sed 's/\/etc\///' | sed 's/-version//' | head -1)
   gotDist "$dist"

   return 1
}

# start with uname and branch the decision from there
dist=$(uname -s 2> /dev/null)
if [ "$dist" = "Linux" ]; then
   linuxRelease
   versionGuess
   giveUp
Elif [ -n "$dist" ]; then
   echo "$dist"
   exit 0
else
   versionGuess
   giveUp
fi

# we shouldn't get here
giveUp
# done
0
Mithril

Ohne Version nur dist:

cat /etc/issue | head -n +1 | awk '{print $1}'
0
coanor

Wenn jemand auch die Distribution braucht:

#!/usr/bin/env bash

LINUX_VERSION_NAME=`lsb_release -sr`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "18.04" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

Ausgabe:

It is: 18.04

Wechseln Sie zu: lsb_release -sc, um die Distribution zu erhalten:

LINUX_VERSION_NAME=`lsb_release -sc`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "bionic" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

Ausgabe:

It is: bionic
0
jturi

Dies wurde unter Ubuntu 14 und CentOS 7 getestet

cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print $1}'
0
BsdHelper

Dieses Skript funktioniert unter Debian (unter Ubuntu ist möglicherweise eine Optimierung erforderlich).

#!/usr/bin/env bash

echo "Finding Debian/ Ubuntu Codename..."

CODENAME=`cat /etc/*-release | grep "VERSION="`
CODENAME=${CODENAME##*\(}
CODENAME=${CODENAME%%\)*}

echo "$CODENAME"
# => saucy, precise, lucid, wheezy, squeeze
0
user9869932

Ich benutze screenfetch Skriptdienstprogramm:

(enter image description here

0
Drakonoved

Hier ist meine einfache chech_distro-Version. ^^;

#!/usr/bin/env bash
check_distro2(){
    if [[ -e /etc/redhat-release ]]
    then
      DISTRO=$(cat /etc/redhat-release)
    Elif [[ -e /usr/bin/lsb_release ]]
    then
      DISTRO=$(lsb_release -d | awk -F ':' '{print $2}')
    Elif [[ -e /etc/issue ]]
    then
      DISTRO=$(cat /etc/issue)
    else
      DISTRO=$(cat /proc/version)
    fi
    }

    check_distro2
    echo $DISTRO
0
niceguy oh

Es gibt einen facter Ruby gem, der Ihnen einige Fakten über das Betriebssystem gibt, Es analysiert Betriebssystem-Release-Dateien, andere Daten und druckt auf dem Terminal-Bildschirm. Sie können Folgendes versuchen, beginnend mit der Installation von Rubygems:

# apt-get install rubygems

Bitte verwenden Sie den obigen Fall, der für Ihr Betriebssystem geeignet ist. Dann installieren Sie den Edelstein selbst.

# gem install facter

Dann benutze:

$ facter

HINWEIS: Weitere Informationen zur Installation finden Sie in den Facter Gem-Quellen.