Comment savoir si la plate-forme en cours d'exécution est Ubuntu ou CentOS à l'aide d'un script Bash?

39

Je connais les commandes pour vérifier le nom de la machine Linux s'exécutant sur ma machine. Par exemple:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

Comment puis-je obtenir la sortie du terminal et comparer pour voir s'il s'agit d'UBUNTU ou de CENTOS et exécuter les commandes suivantes?

apt-get install updates 

ou

yum update

Ubuntu 14.04

cat /etc/issue
shekhar
la source
2
Bienvenue sur Ask Ubuntu. Pourriez-vous consacrer un peu de votre temps à la lecture? Que dois-je faire lorsque quelqu'un répond à ma question?
Sylvain Pineau

Réponses:

53

Malheureusement, il n’existe aucun moyen sûr d’obtenir le nom de la distribution. La plupart des principales distributions s’orientent vers un système dans lequel elles /etc/os-releasestockent ces informations. La plupart des distributions modernes incluent également les lsb_releaseoutils mais ceux-ci ne sont pas toujours installés par défaut. Alors, voici quelques approches que vous pouvez utiliser:

  1. Utilisation /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. Utilisez les lsb_releaseoutils si disponibles

    lsb_release -d | awk -F"\t" '{print $2}'
  3. Utilisez un script plus complexe qui devrait fonctionner pour la grande majorité des distributions:

    # 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. Analyser les informations de version de gccsi installé:

    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.

Cela a essentiellement été directement copié à partir de grande @ slm réponse à ma question ici .

terdon
la source
"Malheureusement, il n’ya pas de moyen sûr de nommer le nom de la distribution." <— Ce n'est pas du tout le cas. Sylvain Pineau , par exemple, a présenté un système simple à une ligne interrogeant de manière fiable le type de plate-forme actuel en passant à Python, préinstallé sur la plupart des plates-formes (y compris Ubuntu). Les scripts shell ne doivent jamais tenter d'interroger manuellement les métadonnées de la plateforme avec des tests de bas niveau non portables du type mis en œuvre dans cette réponse.
Cecil Curry
Gawk n'est pas installé dans Debian par défaut.
Ville Laitila
@VilleLaitila Je crains que ce ne soit pas pertinent ici car ce site concerne uniquement Ubuntu. Mais il n'y a rien de spécifique à gawk ici, donc awkou une mawkautre implémentation fonctionnerait aussi bien.
terdon
Encore plus spécifique avec lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode
@NerdOfCode si vous voulez juste le numéro de version, faites lsb_release -d | awk '{print $3}'ou grep -oP 'VERSION="\K\S+' /etc/os-releasenon, pas besoin du double tuyau pour awk.
terdon
25

Vous n'avez pas besoin de bash pour effectuer une telle tâche, et je suggérerais d'utiliser une approche de haut niveau pour éviter de traiter avec des fichiers tels que /etc/versionet /etc/issue(je n'ai pas / etc / version sur 13.10).

Donc, ma recommandation est d'utiliser cette commande à la place:

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

plateforme python module de fonctionnera sur les deux systèmes, le reste de la commande vérifiera si Ubuntu est renvoyé par python et exécuté par apt-getailleurs yum.

Sylvain Pineau
la source
ajouter -ià greppeut aider.
coanor
8

Voici une réponse simple qui, selon moi, fonctionne dans toutes les versions d'Ubuntu / CentOS / RHEL par la simple présence des fichiers (pas de sécurité intrinsèque, bien sûr, si quelqu'un dépose au hasard / etc / redhat-release sur vos boîtes Ubuntu, etc.):

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

if [ -f /etc/lsb-release ]; then
  apt-get update
fi
Adam
la source
sur mon serveur il n'y a pas de / etc / lsb-release
noonex
3
Je ne vais pas à -1, mais cette réponse n'est pas correcte dans au moins un cas: /etc/lsb-releaseexiste sur CloudLinux (CentOS) 6.8, donc elle renverra à la fois yumet apt-get.
Dhaupin
5

Utilisation Chef pour ces tâches. ;-)

Dans Chef, vous pouvez utiliser la platform?méthode suivante:

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

Ou:

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

Ou:

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

Ou:

if platform?("freebsd", "openbsd")
  # Do BSD things
end
utilisateur1323
la source
1
Bien que manifestement supérieure à coquille centrée bas niveau non-solutions fragiles (par exemple lsb_release, /etc/os-release), cette solution présente l'inconvénient distinct d'exiger Chef - cadre un poids lourd infrastructure code (CIAF) non installé par défaut sur la plupart des plates - formes et nécessitant l' utilisation de son propre langage spécifique au domaine (DSL). En bref, la plupart des utilisateurs veulent probablement simplement faire confiance à Python , qui est installé par défaut sur la plupart des plates-formes (y compris Ubuntu) et s’interface bien avec les scripts shell.
Cecil Curry
5

Recherchez Ubuntu dans le nom du noyau:

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

s'il n'y a que deux distributions, vous pouvez le raccourcir:

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

En quelque sorte, yum -vrenvoyer non-zéro dans CentOS alors utilisez whichplutôt,
bien sûr, vous devriez envisager un scénario s'il n'y en a pas whichinstallé.

Chang Land
la source
2

Le script suivant devrait indiquer s'il s'agit d'Ubuntu. Si ce n'est pas le cas et que votre seule autre option est CentOS, vous devriez l'avoir dans une elseclause:

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

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi
jobin
la source
1
Cela peut probablement être simplifié à l'aide de l' lsb_releaseoutil, qui devrait lire les mêmes fichiers. lsb_release -irapports soit Distributor ID: Ubuntuou Distributor ID: CentOSdans ces cas.
chronite
@chronitis: oui, bien sûr
jobin
Je ne pense pas qu'il soit disponible par défaut sur Centos
Sylvain Pineau,
1

Exécuter /etc/os-releasedans un sous-shell et faire écho à sa valeur:

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

J'utiliserais du 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
Can Tecim
la source
0

L’utilisation de cette commande fonctionne dans CentOS, Ubuntu et Debian: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

Dans Debian, cela donne Debian GNU/Linux, dans Ubuntu, cela donne Ubuntuet dans CentOS, cela donneCentOS Linux .

L'avantage d'utiliser grep, cut and sed au lieu de gawk est clair: gawk n'est pas installé dans Debian par défaut, vous ne pouvez donc pas vous en fier à une boîte de dialogue Debian aléatoire.

Ville Laitila
la source