Jak sprawdzić, czy działającą platformą jest Ubuntu lub CentOS za pomocą skryptu Bash?

39

Znam polecenia, aby sprawdzić nazwę maszyny Linux działającej na moim komputerze. Na przykład:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

Jak uzyskać dane wyjściowe z terminala i porównać, czy jest to UBUNTU lub CENTOS i wykonać następujące polecenia?

apt-get install updates 

lub

yum update

Ubuntu 14.04

cat /etc/issue
shekhar
źródło
2
Witamy w Ask Ubuntu. Czy mógłbyś poświęcić trochę czasu na przeczytanie? Co powinienem zrobić, gdy ktoś odpowie na moje pytanie?
Sylvain Pineau

Odpowiedzi:

53

Niestety nie ma niezawodnego, prostego sposobu na uzyskanie nazwy dystrybucji. Większość głównych dystrybutorów zmierza w kierunku systemu, w którym /etc/os-releaseprzechowują te informacje. Większość współczesnych dystrybucji zawiera również lsb_releasenarzędzia, ale nie zawsze są one instalowane domyślnie. Oto kilka podejść, których możesz użyć:

  1. Posługiwać się /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. Użyj lsb_releasenarzędzi, jeśli są dostępne

    lsb_release -d | awk -F"\t" '{print $2}'
  3. Użyj bardziej złożonego skryptu, który powinien działać dla większości dystrybucji:

    # 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. Analiza informacji o wersji, gccjeśli jest zainstalowana:

    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.

Zostało to w zasadzie skopiowane bezpośrednio z doskonałej odpowiedzi @ slm na moje pytanie tutaj .

terdon
źródło
„Niestety nie ma niezawodnego, prostego sposobu na uzyskanie nazwy dystrybucji”. <— W ogóle tak nie jest. Na przykład Sylvain Pineau wykazał, że trywialny linijka niezawodnie odpytuje bieżący typ platformy, odraczając do Pythona - który jest fabrycznie zainstalowany na większości platform (w tym Ubuntu). Skrypty powłoki nigdy nie powinny próbować ręcznie sprawdzać metadanych platformy za pomocą niskopoziomowych, nieprzenośnych testów tego rodzaju zaimplementowanych w tej odpowiedzi.
Cecil Curry
Gawk nie jest domyślnie instalowany w Debianie.
Ville Laitila,
@VilleLaitila Obawiam się, że nie ma to znaczenia, ponieważ ta strona dotyczy wyłącznie Ubuntu. Ale nie ma nic specyficznego gawk tutaj, więc awkalbo mawkalbo ay inna realizacja będzie działać tak samo dobrze.
terdon
Jeszcze bardziej szczegółowe przy użyciu lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode
@NerdOfCode, jeśli chcesz tylko numer wydania, zrób lsb_release -d | awk '{print $3}'lub grep -oP 'VERSION="\K\S+' /etc/os-releasenie potrzebujesz podwójnej rury do awk.
terdon
25

Nie potrzebujesz basha, aby wykonać takie zadanie, i sugeruję zastosowanie podejścia wysokiego poziomu, aby uniknąć radzenia sobie z plikami takimi jak /etc/versioni /etc/issue(nie mam wersji / etc / w wersji 13.10).

Dlatego zalecam użycie tego polecenia:

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

moduł platformy python będzie działał w obu systemach, reszta polecenia sprawdzi, czy Ubuntu jest zwracane przez python i uruchomi się w apt-getinny sposób yum.

Sylvain Pineau
źródło
dodaj -ido grepmoże pomóc.
coanor
8

Oto prosta odpowiedź, która według mnie działa we wszystkich wersjach Ubuntu / CentOS / RHEL przez samą obecność plików (oczywiście nie jest to bezpieczne, jeśli ktoś losowo upuszcza / etc / redhat-release na twoje pudełka Ubuntu itp.):

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

if [ -f /etc/lsb-release ]; then
  apt-get update
fi
Adam
źródło
na moim ubuntu nie ma / etc / lsb-release
noonex
3
Nie zamierzam -1, ale ta odpowiedź jest niepoprawna w co najmniej jednym przypadku: /etc/lsb-releaseistnieje na CloudLinux (CentOS) 6.8, więc zwróci oba yumi apt-get.
dhaupin
5

Do tych zadań używaj szefa kuchni ;-)

W Chef możesz użyć platform?metody:

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

Lub:

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

Lub:

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

Lub:

if platform?("freebsd", "openbsd")
  # Do BSD things
end
użytkownik1323
źródło
1
O ile wyraźnie przewyższają powłoki zorientowane kruchych non-rozwiązań o niskim poziomie (na przykład lsb_release, /etc/os-release), to rozwiązanie ma wyraźną wadę, że wymaga Chef - w dużej gramaturze infrastruktury jako kod (Iac) ramy nie domyślnie zainstalowana większość platform i wymagające użycia własny język specyficzny dla domeny (DSL). Krótko mówiąc, większość użytkowników prawdopodobnie po prostu chce odroczyć Python , który jest domyślnie instalowany na większości platform (w tym Ubuntu) i dobrze współpracuje ze skryptami powłoki.
Cecil Curry
5

Sprawdź Ubuntu w nazwie jądra:

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

jeśli są tylko dwie dystrybucje, możesz je skrócić:

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

w jakiś sposób yum -vzwraca wartość niezerową w CentOS, więc użyj whichzamiast tego,
oczywiście powinieneś rozważyć scenariusz, jeśli nie jest whichzainstalowany.

Chang Land
źródło
2

Poniższy skrypt powinien powiedzieć, czy to Ubuntu. Jeśli tak nie jest, a jedyną dostępną opcją jest CentOS, powinieneś mieć ją w elseklauzuli:

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

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi
Praca w
źródło
1
Można to prawdopodobnie uprościć za pomocą lsb_releasenarzędzia, które powinno odczytać te same pliki. lsb_release -iRaporty albo Distributor ID: Ubuntuczy Distributor ID: CentOSw tych przypadkach.
chronitis
@ synchronitis: tak, na pewno może być
jobin
Nie sądzę jednak, aby była domyślnie dostępna w Centos
Sylvain Pineau
1

Wykonaj /etc/os-releasew podpowłoce i wyświetl jej wartość:

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi
JobWat
źródło
0

Chciałbym użyć Pythona

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
Czy Tecim
źródło
0

Użycie tego polecenia działa w CentOS, Ubuntu i Debian: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

W Debianie daje Debian GNU/Linux, w Ubuntu daje, Ubuntuaw CentOS daje CentOS Linux.

Korzyści z używania grep, cut i sed zamiast gawk są oczywiste: Debian nie ma domyślnie zainstalowanego gawk, więc nie możesz polegać na losowym pudełku Debiana.

Ville Laitila
źródło