GNU/Linux >> Tutoriels Linux >  >> Linux

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

Supposons que je sois connecté à un système distant, comment puis-je savoir ce qu'il exécute ? Sur la plupart des Linux modernes (Linuces ?), vous avez le lsb_release commande :

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Ce qui, pour autant que je sache, donne simplement les mêmes informations que /etc/lsb-release . Que faire si ce fichier n'est pas présent ? Je crois me rappeler que le lsb_release La commande est relativement nouvelle, alors que se passe-t-il si je dois obtenir le système d'exploitation d'un système plus ancien ?

Dans tous les cas, lsb signifie Linux Standard Base donc je suppose que cela ne fonctionnera pas sur les Unix non-Linux. Autant que je sache, il n'y a aucun moyen d'obtenir cette information de uname alors comment puis-je l'obtenir sur des systèmes qui n'utilisent pas lsb_release ?

Réponse acceptée :

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 poussée 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 !

En relation :Comment faire un `tail -f` des fichiers de rotation de journal ?

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 à utiliser 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 

Linux
  1. Comment nommer un thread sous Linux ?

  2. Comment obtenir le nom et la version de la distribution Linux ?

  3. Comment obtenir le nombre de CPU sous Linux en utilisant C ?

  4. Comment obtenir le nombre de disques physiques sous Linux ?

  5. Comment obtenir la taille physique d'un fichier sous Linux ?

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

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

Comment obtenir le nom de fichier à partir du chemin complet sous Linux

Comment obtenir le nombre de processeurs/cœurs sous Linux

Comment changer le nom d'hôte sur Debian Linux

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