lsb_release -a
sera probablement votre meilleure option pour trouver ces informations et être en mesure de le faire de manière cohérente.
Histoire de LSB
Le lsb
dans cette commande représente le projet Linux Standards Base qui est un projet parapluie parrainé par la Fondation Linux pour fournir des méthodes génériques pour faire des choses de base sur diverses distributions Linux.
Le projet est volontaire et les fournisseurs peuvent participer au projet en tant qu'utilisateurs et également en tant que facilitateurs des diverses spécifications autour de différents modules qui contribuent à la normalisation au sein des différentes distributions Linux.
extrait de la charte
Le groupe de travail LSB a pour principal objectif de répondre à ces deux préoccupations. Nous publions une norme qui décrit l'ensemble minimal d'API qu'une distribution doit prendre en charge, en consultation avec les principaux fournisseurs de distribution. Nous fournissons également des tests et des outils qui mesurent la prise en charge de la norme et permettent aux développeurs d'applications de cibler l'ensemble commun. Enfin, grâce à notre travail de test, nous cherchons à éviter des divergences inutiles entre les distributions.
Liens utiles liés à LSB
- Charte LSB
- Groupe de travail LSB
- Feuille de route LSB
- Liste de diffusion LSB (l'activité actuelle est ici !)
- Liste des produits certifiés LSB
- Page Wikipédia de la LSB
Critiques
Il existe un certain nombre de problèmes avec LSB qui le rendent problématique pour les distributions telles que Debian. L'utilisation forcée de RPM en est une. Voir l'article de Wikipédia pour en savoir plus sur le sujet.
Novel
Si vous effectuez une recherche, vous tomberez peut-être sur une page assez datée intitulée :Detecting Underlying Linux Distro from Novell. C'est l'un des rares endroits où j'ai vu une liste réelle qui montre plusieurs des principales distributions et comment vous pouvez détecter celle sous-jacente que vous utilisez.
extrait
Novell SUSE /etc/SUSE-release
Red Hat /etc/redhat-release, /etc/redhat_version
Fedora /etc/fedora-release
Slackware /etc/slackware-release, /etc/slackware-version
Debian /etc/debian_release, /etc/debian_version,
Mandrake /etc/mandrake-release
Yellow dog /etc/yellowdog-release
Sun JDS /etc/sun-release
Solaris/Sparc /etc/release
Gentoo /etc/gentoo-release
UnitedLinux /etc/UnitedLinux-release
ubuntu /etc/lsb-release
Cette même page comprend également un script pratique qui tente de codifier pour ce qui précède en utilisant uniquement la vanille uname
commandes, et la présence de l'un des fichiers ci-dessus.
REMARQUE : Cette liste est datée mais vous pouvez facilement supprimer les distributions datées telles que Mandrake de la liste et les remplacer par des alternatives. Ce type de script peut être une approche si vous essayez de prendre en charge un large éventail de variantes Solaris et Linux.
Mafia Linux
Une recherche plus approfondie fera apparaître la page suivante maintenue sur Linuxmafia.com, intitulée :/etc/release equivalents for divers Linux (and other Unix) distributions. C'est probablement la liste la plus exhaustive à ce jour que j'ai vue. Vous pouvez codifier cette liste avec une instruction case/switch et l'inclure dans le cadre de la distribution de votre logiciel.
En fait, il y a un script au bas de cette page qui fait exactement cela. Vous pouvez donc simplement télécharger et utiliser le script en tant que tiers pour votre distribution de logiciels.
script
#!/bin/sh
# Detects which OS and if it is Linux then it will detect which Linux
# Distribution.
OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`
GetVersionFromFile()
{
VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}
if [ "${OS}" = "SunOS" ] ; then
OS=Solaris
ARCH=`uname -p`
OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
elif [ "${OS}" = "AIX" ] ; then
OSSTR="${OS} `oslevel` (`oslevel -r`)"
elif [ "${OS}" = "Linux" ] ; then
KERNEL=`uname -r`
if [ -f /etc/redhat-release ] ; then
DIST='RedHat'
PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
elif [ -f /etc/SuSE-release ] ; then
DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
elif [ -f /etc/mandrake-release ] ; then
DIST='Mandrake'
PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
elif [ -f /etc/debian_version ] ; then
DIST="Debian `cat /etc/debian_version`"
REV=""
fi
if [ -f /etc/UnitedLinux-release ] ; then
DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
fi
OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"
fi
echo ${OSSTR}
REMARQUE : Ce script devrait vous sembler familier, c'est une version à jour de celui de Novell !
Script d'espace pour les jambes
Une autre méthode que j'ai vue utilisée consiste à lancer votre propre script, similaire à la méthode Novell ci-dessus, mais en utilisant à la place LSB. Cet article intitulé :Méthode générique pour déterminer le nom de distribution Linux (ou UNIX), montre une de ces méthodes.
# 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
Ce morceau de code pourrait être inclus dans le /etc/bashrc
d'un système ou un fichier de ce type qui définirait alors la variable d'environnement $DISTRO
.
gcc
Croyez-le ou non, une autre méthode consiste à utiliser gcc
. Si vous interrogez la commande gcc --version
vous obtiendrez la distribution pour laquelle gcc a été construit, qui est invariablement la même que le système sur lequel il s'exécute.
Fédora 14
$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.
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.
TL;DR;
Alors lequel dois-je utiliser ? J'aurais tendance à aller avec lsb_release -a
pour toutes les distributions Linux que je fréquenterais (RedHat, Debian, Ubuntu, etc.). Pour les situations où vous prenez en charge des systèmes qui ne fournissent pas lsb_release
Je lancerais le mien dans le cadre de la distribution du logiciel que je fournis, similaire à l'un des scripts ci-dessus.
MISE À JOUR #1 :Suivi avec SuSE
En parlant avec @Nils dans les commentaires ci-dessous, il a été déterminé que pour une raison quelconque, SLES11 semblait supprimer LSB de l'installation par défaut. Il s'agissait uniquement d'une installation facultative, ce qui semblait aller à l'encontre d'un package fournissant ce type de fonctionnalité clé.
J'en ai donc profité pour contacter quelqu'un du projet OpenSuSE pour comprendre pourquoi.
extrait d'e-mail
Hi Rob,
I hope you don't mind me contacting you directly but I found your info here:
https://en.opensuse.org/User:Rjschwei. I participate on one of the StackExchange
sites, Unix & Linux and a question recently came up regarding the best option
for determining the underlying OS.
http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name/92218?noredirect=1#comment140840_92218
In my answer I suggested using lsb_release, but one of the other users mentioned
that this command wasn't installed as part of SLES11 which kind of surprised me.
Anyway we were looking for some way to confirm whether this was intentionally
dropped from SLES or it was accidental.
Would you know how we could go about confirming this one way or another?
Thanks for reading this, appreciate any help and/or guidance on this.
-Sam Mingolelli
http://unix.stackexchange.com/users/7453/slm
Voici la réponse de Rob
Hi,
On 10/01/2013 09:31 AM, Sam Mingo wrote:
- show quoted text -
lsb_release was not dropped in SLES 11. SLES 11 is LSB certified. However, it
is not installed by default, which is consistent with pretty much every other
distribution. The lsb_release command is part of the lsb-release package.
At present almost every distribution has an entry in /etc such as
/etc/SuSE-release for SLES and openSUSE. Since this is difficult for ISVs and
others there is a standardization effort going on driven by the convergence to
systemd. The standard location for distribution information in the future will
be /etc/os-release, although Ubuntu will probably do something different.
HTH,
Robert
-- Robert Schweikert MAY THE SOURCE BE WITH YOU
SUSE-IBM Software Integration Center LINUX
Tech Lead
Public Cloud Architect
Puisque vous ne pourrez probablement pas installer facter
sur un serveur distant, vous pouvez imiter ce qu'il fait pour trouver le nom du système d'exploitation. Le code Ruby pour le operatingsystem
fait peut être trouvé ici sur pastebin. En gros, il parcourt les différents *-release
fichiers et autres pour déterminer le nom du système d'exploitation.
Certains des fichiers qu'il examine :
/etc/debian_version
/etc/gentoo-release
/etc/fedora-release
/etc/mandriva-release
/etc/mandrake-release
/etc/meego-release
/etc/arch-release
/etc/oracle-release
/etc/enterprise-release
/etc/ovs-release
/etc/vmware-release
/etc/redhat-release
/etc/SuSE-release
/etc/bluewhite64-version
/etc/slamd64-version
/etc/slackware-version
/etc/alpine-release
/etc/system-release
/etc/centos-release
Je suis désolé si vous trouvez des doublons dans cette liste, je l'ai produite rapidement avec grep
. Cela devrait être assez facile (bien qu'un peu fastidieux) de le porter dans un script shell POSIX.
Au cas où vous auriez python
installé (peu importe que Python 3 ou Python 2), vous pouvez trouver le nom de la distribution sans réinventer la roue :
python -c "import platform;print(platform.linux_distribution()[0])"