Je connais les commandes pour vérifier le nom de la machine Linux s'exécutant sur ma machine. Par exemple:
cat /etc/version
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
cat /etc/issue
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:
Utilisez /etc/os-release
awk -F= '/^NAME/{print $2}' /etc/os-release
Utilisez les outils lsb_release
s'ils sont disponibles
lsb_release -d | awk -F"\t" '{print $2}'
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
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 .
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
.
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
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
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 which
n'est installé.
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
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
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
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, Ubuntu
et 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.
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