GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je obtenir de manière fiable le nom du système d'exploitation ?

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])"

Linux
  1. Comment puis-je obtenir l'état du clavier sous Linux?

  2. Comment puis-je obtenir le nom d'utilisateur dans un Makefile ?

  3. Comment vérifier le système d'exploitation en Python ?

  4. Comment obtenir le système d'exploitation actuel dans MSBuild ?

  5. Comment puis-je modifier le délai avant que le système ne se verrouille ?

Comment obtenir la taille d'un répertoire sous Linux

Comment récupérer la notification Skype dans la barre d'état système ?

Où puis-je trouver la première version du système d'exploitation Linux ?

Comment puis-je obtenir la longueur d'un fichier vidéo à partir de la console ?

Si je connais le numéro PID d'un processus, comment puis-je obtenir son nom ?

Comment obtenir le nom de l'ordinateur (pas son nom d'hôte) ?