web-dev-qa-db-fra.com

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

Supposons que je suis connecté à un système distant, comment savoir ce qu'il fonctionne? Sur la plupart des Linux modernes (Linuces?), Vous avez le lsb_release commande:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Pour autant que je sache, les mêmes informations que /etc/lsb-release. Et si ce fichier n'est pas présent? Il me semble que le lsb_release La commande est relativement nouvelle, et si je dois obtenir le système d'exploitation d'un ancien système?

Dans tous les cas, lsb signifie Linux Standard Base donc je suppose que cela ne fonctionnera pas sur les unités non Linux. Pour autant que je sache, il n'y a aucun moyen d'obtenir ces informations de uname alors comment puis-je obtenir cela sur des systèmes qui n'utilisent pas lsb_release?

70
terdon

lsb_release -a Sera probablement votre meilleure option pour trouver ces informations et pouvoir 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-cadre parrainé par le Linux Foundation pour fournir des méthodes génériques pour faire des types de base de des choses sur diverses distributions Linux.

Le projet est volontaire et les fournisseurs peuvent participer au projet en tant qu'utilisateur et également en tant que facilitateurs des différentes spécifications autour de différents modules qui aident à conduire la normalisation dans les différentes distributions Linux.

extrait de la charte

Le groupe de travail LSB a pour objectif principal 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 à nos tests, nous cherchons à éviter les divergences inutiles entre les distributions.

Liens utiles liés au LSB

Des reproches

Il y a 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 le article Wikipédia pour en savoir plus .

Novell

Si vous recherchez, vous rencontrerez probablement une page d'aspect assez datée intitulée: Detecting Underlying Linux Distro de 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 les commandes Vanilla uname 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 une large gamme de variantes Solaris et Linux.

Linux Mafia

Plus de recherches apparaîtront sur la page suivante maintenue sur Linuxmafia.com, intitulée: / etc/release équivalents pour diverses distributions Linux (et autres distributions Unix) . C'est probablement la liste la plus exhaustive à ce jour que j'ai vue. Vous pouvez codifier cette liste avec une déclaration de cas/commutateur et l'inclure dans votre distribution de logiciels.

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 tierce partie de 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 Novell!

Script d'espace pour les jambes

Une autre méthode que j'ai vue employée est de lancer votre propre script, similaire à la méthode Novell ci-dessus mais en utilisant LSB à la place. Cet article intitulé: Méthode générique pour déterminer le nom de distribution Linux (ou UNIX) , montre une telle méthode.

# 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 dans un tel fichier 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 fonctionne.

Fedora 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 des logiciels 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 empêcher l'installation de LSB par défaut. Il ne s'agissait que d'une installation facultative, qui semblait contraire à un package qui fournit ce type de fonctionnalité clé.

J'ai donc profité de l'occasion pour contacter quelqu'un du projet OpenSuSE pour comprendre pourquoi.

extrait d'email

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 
74
slm

Comme 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 fait operatingsystem peut être trouvé ici sur Pastebin . Fondamentalement, il examine 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 produit rapidement avec grep. Cela devrait être assez facile (quoique un peu fastidieux) de le porter dans un script Shell POSIX.

16
Joseph R.

Si vous avez python installé (peu importe si 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])"
9
heinrich5991

/etc/issue doit contenir les informations de version. Je suis assez certain de l'avoir vu sur les systèmes Solaris. Voici le fichier d'un système Debian moderne:

$ cat /etc/issue
Debian GNU/Linux 7 \n \l

$ 

/ etc/issue est également mentionné dans le FHS (qui n'est pas uniquement pour les systèmes Linux), bien qu'il soit "facultatif".

6
user4443

Vous ne pouvez pas obtenir de manière fiable le nom de la distribution à partir d'une seule commande dans toutes les distributions. Certains sont disponibles via/etc/* - release et d'autres via la commande 'lsb-release'.

6
boz

J'ai utilisé cette commande Shell pour obtenir une chaîne indiquant la distribution Linux:

for f in $(find /etc -type f -maxdepth 1 \( ! -wholename /etc/os-release ! -wholename /etc/lsb-release -wholename /etc/\*release -o -wholename /etc/\*version \) 2> /dev/null); do echo ${f:5:${#f}-13}; done;

cette commande est basée sur les réponses de Joseph R. et slm.

Il recherche simplement des fichiers comme/etc/{osname} -release ou/etc/{osname} _version et affiche un nom de système d'exploitation particulier.

Cela a fonctionné dans

  • CentOS (centos)
  • RedHat (redhat)
  • Debian (debian)
  • Arc (Arc)
  • OpenSUSE (OpenSUSE)
  • Fedora (Fedora)
  • Ubuntu (debian)
4
scrutari

SNMP est un protocole suffisamment omniprésent pour se retrouver dans de nombreux types de distributions GNU/Linux et de systèmes UNIX.

L'objet system.sysDescr.0 dans SNMPv2-MIB peut vous aider à trouver le système d'exploitation que vous contactez, à condition qu'un démon SNMP s'exécute dans le système cible:

La description

Une description textuelle de l'entité. Cette valeur doit inclure le nom complet et l'identification de la version du type de matériel du système, du système d'exploitation logiciel et du logiciel de mise en réseau.

Statut: actuel

Accès: lecture seule

La page de manuel snmpget(1) explique comment récupérer cette valeur avec des exemples.

1
dawud

Puisqu'il n'y a aucun moyen commun de le faire, nous avons défini une chaîne de libération via la commande snmp exec.

La tâche de cette commande est d'imprimer la distribution et la version actuelle majeure/mineure du système d'exploitation.

Sur RH et les clones, nous analysons/etc/redhat-release, sur SuSe SuSe-release ...

1
Nils

Utilisation /etc/os-release:

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.10 (Cosmic Cuttlefish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.10"
VERSION_ID="18.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=cosmic
UBUNTU_CODENAME=cosmic

Les raisons sont bien expliquées dans un FAQ par un lien http://0pointer.de/blog/projects/os-release.html fourni gratuitement par @weberjn in ce commentaire . Je viens d'énumérer ici un argument contre l'utilisation du lsb_release qui est jusqu'à présent la réponse la mieux notée de 2013.

Il y a déjà l'outil lsb_release pour cela, pourquoi ne pas simplement l'utiliser? Eh bien, c'est une interface très étrange: un script Shell que vous devez invoquer (et donc apparaître de manière asynchrone à partir de votre code C), et il n'est pas écrit pour être extensible. C'est un package optionnel dans de nombreuses distributions, et rien que nous serions heureux d'invoquer dans le cadre d'un démarrage précoce afin d'afficher un message de bienvenue. (Dans les temps avec des temps de démarrage inférieurs à la seconde utilisateur, nous ne voulons vraiment pas invoquer un énorme script Shell pour une trivialité comme l'affichage du message de bienvenue). L'outil lsb_release nous semble être une tentative d'abstraction des contrôles de distribution, où la standardisation des contrôles de distribution est nécessaire. C'est simplement une interface mal conçue. À notre avis, il a son utilisation comme interface pour déterminer la version LSB elle-même, mais pas pour vérifier la distribution ou la version.

1

D'après ce que j'ai réussi à glaner de ce fil, vous devriez pouvoir obtenir les informations de n'importe quel système en utilisant:

if which lsb_release &>> /dev/null; then
    lsb_release -a
Elif [ -r /etc/issue ]; then
    cat /etc/issue
else
    ls /etc/ | grep -e '[_-]release$' -e '[_-]version$' | xargs -I % -n 1 cat /etc/%
fi
1
Sammitch

Si une situation l'exigeait, vous pourriez le découvrir à distance en utilisant snmpwalk [ou le protocole SNMP en général]. Un exemple est ci-dessous:

snmpwalk -Os -c <snmp community string> -v1 <hostname> sysDescr.0

OUPUT: sysDescr.0 = STRING: Linux example.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP sam. 14 sept. 05:32:37 EDT 2013 x86_64

La clé de la fiabilité est de savoir si SNMP est correctement configuré dans votre environnement, tous les hôtes ont snmp en cours d'exécution avec une configuration de chaînes de communauté appropriée.

1
xpros