Come sapere se la piattaforma in esecuzione è Ubuntu o CentOS con l'aiuto di uno script Bash?


39

Conosco i comandi per verificare il nome della macchina Linux in esecuzione sulla mia macchina. Per esempio:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

Come posso ottenere l'output dal terminale e confrontarlo per vedere se è UBUNTU o CENTOS ed eseguire i seguenti comandi?

apt-get install updates 

o

yum update

Ubuntu 14.04

cat /etc/issue

2
Benvenuto in Ask Ubuntu. Per favore, potresti dedicare un po 'del tuo tempo a leggere Cosa devo fare quando qualcuno risponde alla mia domanda?
Sylvain Pineau,

Risposte:


53

Sfortunatamente, non esiste un modo sicuro e semplice per ottenere il nome della distribuzione. La maggior parte delle distro si sta spostando verso un sistema in cui vengono utilizzate /etc/os-releaseper memorizzare queste informazioni. La maggior parte delle distribuzioni moderne include anche gli lsb_releasestrumenti, ma questi non sono sempre installati per impostazione predefinita. Quindi, ecco alcuni approcci che puoi usare:

  1. Uso /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. Utilizzare gli lsb_releasestrumenti se disponibili

    lsb_release -d | awk -F"\t" '{print $2}'
  3. Usa uno script più complesso che dovrebbe funzionare per la maggior parte delle distro:

    # 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. Analizza le informazioni sulla versione di gccse installato:

    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.

Questo è stato sostanzialmente copiato direttamente dall'ottima risposta di @ slm alla mia domanda qui .


"Sfortunatamente, non esiste un modo sicuro e semplice per ottenere il nome della distribuzione." <— Non è assolutamente il caso. Sylvain Pineau , ad esempio, ha mostrato un banale one-liner eseguendo una query affidabile sul tipo di piattaforma corrente rimandando a Python, che viene preinstallato sulla maggior parte delle piattaforme (incluso Ubuntu). Gli script di shell non dovrebbero mai tentare di interrogare manualmente i metadati della piattaforma con test di basso livello e non portatili del tipo implementato in questa risposta.
Cecil Curry,

Gawk non è installato in Debian di default.
Ville Laitila,

@VilleLaitila Temo che non sia rilevante qui poiché questo sito riguarda solo Ubuntu. Ma qui non c'è nulla di specifico di gawk, quindi awko mawko qualsiasi altra implementazione funzionerebbe altrettanto bene.
terdon

Ancora più specifico usando lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode

@NerdOfCode se vuoi solo il numero di rilascio, do lsb_release -d | awk '{print $3}'o grep -oP 'VERSION="\K\S+' /etc/os-release, non è necessario che il double pipe si attivi.
terdon

25

Non hai bisogno di bash per fare questo compito, e suggerirei di usare un approccio di alto livello per evitare di gestire file come /etc/versione /etc/issue(non ho / etc / versione il 13.10).

Quindi la mia raccomandazione è di usare questo comando invece:

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

Il modulo della piattaforma python funzionerà su entrambi i sistemi, il resto del comando verificherà se Ubuntu viene restituito da Python ed eseguirà apt-getaltro yum.


aggiungere -ia greppuò aiutare.
coanor

8

Ecco una semplice risposta che trovo funzioni su tutte le versioni di Ubuntu / CentOS / RHEL per la semplice presenza dei file (ovviamente non a prova di errore se qualcuno rilascia casualmente / etc / redhat-release sui tuoi box Ubuntu, ecc.):

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

if [ -f /etc/lsb-release ]; then
  apt-get update
fi

sul mio ubuntu non c'è / etc / lsb-release
noonex il

3
Non ho intenzione di -1, ma questa risposta non è corretta in almeno un caso: /etc/lsb-releaseesiste su CloudLinux (CentOS) 6.8, quindi restituirà sia yume apt-get.
Dhaupin,

5

Usa Chef per questi compiti. ;-)

In Chef, puoi utilizzare il platform?metodo:

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

O:

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

O:

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

O:

if platform?("freebsd", "openbsd")
  # Do BSD things
end

1
Sebbene sia evidentemente superiore alle fragili non-soluzioni di basso livello incentrate sulla shell (ad es. lsb_release, /etc/os-release), Questa soluzione presenta il netto svantaggio di richiedere Chef: un framework IaC (Heavyweight Infrastructure as Code) non installato di default sulla maggior parte delle piattaforme e che richiede l'uso di il proprio linguaggio specifico del dominio (DSL). In breve, la maggior parte degli utenti probabilmente desidera semplicemente rinviare a Python , che è installato di default sulla maggior parte delle piattaforme (incluso Ubuntu) e si interfaccia bene con gli script di shell.
Cecil Curry,

5

Cerca Ubuntu nel nome del kernel:

if [  -n "$(uname -a | grep Ubuntu)" ]; then
    sudo apt-get update && sudo apt-get upgrade 
else
    yum update
fi  

4
 apt-get -v &> /dev/null && apt-get update
 which yum &> /dev/null && yum update

se ci sono solo due distro, puoi renderlo più breve:

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

in qualche modo yum -vrestituisce un valore diverso da zero in CentOS, quindi usa whichinvece,
ovviamente dovresti considerare lo scenario se non è whichinstallato.


2

Il seguente script dovrebbe dire se è Ubuntu. Se non lo è e l'unica altra opzione che hai è CentOS, dovresti averlo in una elseclausola:

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

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi

1
Questo può probabilmente essere semplificato usando lo lsb_releasestrumento, che dovrebbe leggere gli stessi file. lsb_release -iriporta uno Distributor ID: Ubuntuo Distributor ID: CentOSin questi casi.
cronite,

@chronitis: sì, certo che può essere
jobin

Non credo sia disponibile di default su Centos
Sylvain Pineau

1

Esegui /etc/os-releasein una sub shell ed echo il suo valore:

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

0

Vorrei usare Python

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

0

L'uso di questo comando funziona in CentOS, Ubuntu e Debian: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

In Debian cede Debian GNU/Linux, in Ubuntu cede Ubuntue in CentOS cede CentOS Linux.

Il vantaggio di usare grep, cut e sed al posto di gawk è evidente: Debian non ha gawk installato di default, quindi non si può fare affidamento su di esso in un Debian box casuale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.