web-dev-qa-db-fra.com

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

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

Ubunutu 14.04

cat /etc/issue
38
shekhar

Malheureusement, il n’existe aucun moyen sûr d’obtenir le nom de la distribution. La plupart des distributions majeures se dirigent vers un système dans lequel elles utilisent /etc/os-release pour stocker ces informations. La plupart des distributions modernes incluent également les outils lsb_release, mais ils ne sont pas toujours installés par défaut. Alors, voici quelques approches que vous pouvez utiliser:

  1. Utilisez /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
    
  2. Utilisez les outils lsb_release s'ils sont 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 gcc si 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 été fondamentalement directement copié de l'excellent @ slm réponse à ma question ici .

47
terdon

Vous n'avez pas besoin de bash pour faire 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/version et /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

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

25
Sylvain Pineau

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
7
Adam

Utilisez Chef pour ces tâches. ;-)

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

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
5
user1323
 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

yum -v retourne une valeur différente de zéro dans CentOS, utilisez donc whichà la place,
Bien sûr, vous devriez envisager un scénario si aucun whichn'est installé.

4
Chang Land

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  
4
Harris

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 clause else:

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

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

Exécutez /etc/os-release dans un sous-shell et reprenez sa valeur:

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

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, il génère Debian GNU/Linux, dans Ubuntu, Ubuntuet dans CentOS, CentOS 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.

0
Ville Laitila

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
0
Can Tecim