Solution 1 :
Il n'y a pas de moyen de distribution croisée. Cependant :
- Redhat et ses amis :test pour
/etc/redhat-release
, vérifier le contenu- Debian :tester
/etc/debian_version
, vérifier le contenu- Mandriva et ses amis :test pour
/etc/version
, vérifier le contenu- Slackware :testez
/etc/slackware-version
, vérifier le contenu
Etc. De manière générale, vérifiez /etc/*-release
et /etc/*-version
.
Edit:J'ai trouvé un vieux script bash (plus d'un an) que j'ai dû bricoler au fil des ans (il a un journal CVS impressionnant remontant à 6 ans.) Il se peut qu'il ne fonctionne plus correctement tel quel et je peux ne vous embêtez pas à trouver des distributions installées pour tester, mais cela devrait vous fournir un bon point de départ. Cela fonctionne bien sur CentOS, Fedora et Gentoo. gyaresu l'a testé avec succès sur Debian Lenny.
#!/bin/bash
get_distribution_type()
{
local dtype
# Assume unknown
dtype="unknown"
# First test against Fedora / RHEL / CentOS / generic Redhat derivative
if [ -r /etc/rc.d/init.d/functions ]; then
source /etc/rc.d/init.d/functions
[ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"
# Then test against SUSE (must be after Redhat,
# I've seen rc.status on Ubuntu I think? TODO: Recheck that)
elif [ -r /etc/rc.status ]; then
source /etc/rc.status
[ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"
# Then test against Debian, Ubuntu and friends
elif [ -r /lib/lsb/init-functions ]; then
source /lib/lsb/init-functions
[ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"
# Then test against Gentoo
elif [ -r /etc/init.d/functions.sh ]; then
source /etc/init.d/functions.sh
[ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"
# For Slackware we currently just test if /etc/slackware-version exists
# and isn't empty (TODO: Find a better way :)
elif [ -s /etc/slackware-version ]; then
dtype="slackware"
fi
echo $dtype
}
Notez que cela ne fonctionnera probablement correctement que dans Bash. Vous pouvez le réécrire pour d'autres shells.
Cela étant dit, vous voudrez peut-être tester les fonctionnalités, pas les distributions. Je ne l'utilise plus simplement parce que c'est devenu un fardeau de maintenance. Il est plus facile de s'appuyer sur des outils et des solutions de distribution croisée.
Conceptuellement, ce qu'il fait est, dans l'ordre :
- Insérez un type de fichier connu, "fonction de script d'initialisation commune". Ceux-ci sont spécifiques à la distribution. S'il n'existe pas, passez à la vérification de distribution suivante.
- Vérifier l'existence d'une fonction spécifique, connue pour exister, souvent utilisée et peu susceptible d'être renommée à partir de ce script principal. Nous le faisons en utilisant le
type
Bash intégré.type -t
renvoiefunction
si ce symbole est une fonction. On ajoutezz
à la sortie detype -t 2>/dev/null
car si le nom n'est pas défini, la chaîne de sortie serait vide et nous aurions une erreur de syntaxe à propos d'une main gauche manquante au==
opérateur. Si le nom que nous venons de vérifier n'est pas une fonction, passez à la prochaine vérification de distribution, sinon nous avons trouvé le type de distribution.- Enfin, faites écho au type de distribution afin que la sortie de la fonction puisse être facilement utilisée dans un bloc case .. esac.
Modifiez au cas où vous essaieriez de l'exécuter en tant que script simple :ce script est censé provenir ou être inclus à partir d'autres scripts. Il ne produit rien par lui-même si vous l'exécutez tel quel. Pour le tester, sourcez-le puis appelez la fonction, par exemple :
source /path/to/this/script.sh
get_distribution_type
à l'invite bash.
Edit :Veuillez noter que ce script ne nécessite pas les privilèges root. Je vous conseille vivement de ne pas l'exécuter en tant que root. Cela ne devrait rien nuire, mais ce n'est pas nécessaire.
Trouvé un lien vers une liste de diffusion pertinente dans le journal CVS. Devrait être utile pour déballer les spaghettis de script d'initialisation.
Solution 2 :
N'essayez pas de faire des suppositions basées sur la distribution quant à ce que vous pouvez et ne pouvez pas faire, car c'est la folie (voir aussi "Détection de l'agent utilisateur"). Au lieu de cela, détectez si ce que vous voulez faire est pris en charge et comment cela est fait par la commande ou l'emplacement de fichier que vous souhaitez utiliser.
Par exemple, si vous vouliez installer un paquet, vous pouvez détecter si vous êtes sur un système de type Debian ou un système de type RedHat en vérifiant l'existence de dpkg ou rpm (vérifiez d'abord dpkg, car les machines Debian peuvent avoir la commande rpm dessus...). Prenez votre décision quant à ce qu'il faut faire en fonction de cela, pas seulement en fonction du fait qu'il s'agisse d'un système Debian ou RedHat. De cette façon, vous prendrez automatiquement en charge toutes les distributions dérivées que vous n'avez pas explicitement programmées. Oh, et si votre paquet nécessite des dépendances spécifiques, testez-les également et faites savoir à l'utilisateur ce qu'il manque.
Un autre exemple est de jouer avec les interfaces réseau. Déterminez ce qu'il faut faire en fonction de l'existence d'un fichier /etc/network/interfaces ou d'un répertoire /etc/sysconfig/network-scripts, et partez de là.
Oui, c'est plus de travail, mais à moins que vous ne vouliez refaire toutes les erreurs que les développeurs Web ont commises au cours de la dernière décennie ou plus, vous le ferez de manière intelligente dès le début.
Solution 3 :
Vous pouvez trouver la version du noyau en exécutant uname -a
, trouver la version de la distribution dépend de la distribution.
Sur Ubuntu et certains autres systèmes d'exploitation, vous pouvez exécuter lsb_release -a
ou lisez /etc/lsb_release
Debian stocke la version dans /etc/debian_version
Solution 4 :
La plupart des distributions ont une méthode unique pour déterminer la distribution particulière.
Par exemple :
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
Il existe une norme connue sous le nom de Linux Standard Base ou LSB. Elle définit qu'il devrait y avoir un fichier appelé /etc/lsb-release ou un programme appelé lsb_release qui renverra des informations sur votre distribution Linux.
lsb_release -a
Solution 5 :
python -c 'import platform ; print platform.dist()[0]'
code :http://hg.python.org/cpython/file/2.7/Lib/platform.py