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

69

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

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Ce qui, autant que je sache, ne donne que les mêmes informations que /etc/lsb-release. Et si ce fichier n'est pas présent? Je semble me souvenir que la lsb_releasecommande est relativement nouvelle, alors que se passe-t-il si je dois obtenir le système d'exploitation d'un ancien système?

Dans tous les cas, cela lsbsignifie Linux Standard Baseque je suppose que cela ne fonctionnera pas sur les Unices non Linux. Autant que je sache, il n’ya aucun moyen d’obtenir cette information, unamealors comment puis-je l’obtenir sur des systèmes inutilisés lsb_release?

terdon
la source
1
unix.stackexchange.com/questions/6345/… pour Linux. uname -sdevrait être suffisant en dehors de Linux (peut-être pour les BSD).
Mat le
Avez-vous vérifié facter? facter operatingsystemdevrait faire ce que vous voulez sur tous les systèmes a facterété fait pour travailler avec.
Joseph R.
@JosephR. semble bon mais n'est pas installé par défaut.
terdon
1
J'ai collé le factercode qui obtient le nom du système d'exploitation sur pastebin. Trouvez le ici . Il vérifie de nombreux fichiers différents pour obtenir le nom de manière fiable.
Joseph R.
@JosephR. wow, ça fait beaucoup de fichiers. Je vais porter ça au hasard quand j'en ai l'occasion, ça devrait être assez portable. Merci!
terdon

Réponses:

72

lsb_release -a va probablement être votre meilleure option pour trouver cette information, et être capable de le faire de manière cohérente.

Histoire de LSB

La lsbcommande dans cette commande correspond au projet Linux Standards Base, un projet parapluie parrainé par la Linux Foundation, qui fournit des méthodes génériques permettant d’effectuer des opérations de base sur diverses distributions Linux.

Le projet est volontaire et les fournisseurs peuvent participer au projet en tant qu'utilisateur mais également en tant que facilitateurs des différentes spécifications relatives aux différents modules permettant de normaliser 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 décrivant 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 relatifs à LSB

des reproches

LSB présente un certain nombre de problèmes qui le rendent problématique pour des distributions telles que Debian. L'utilisation forcée de RPM étant un. Voir l'article Wikipedia pour plus d'informations à ce sujet .

Novell

Si vous effectuez une recherche, vous rencontrerez peut-être une page assez datée, intitulée: Détecter la distro sous-jacente Linux de Novell. C’est l’un des rares endroits où j’ai vu une liste 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 inclut également un script pratique qui tente de codifier ce qui précède à l’aide de unamecommandes simplement vanilla et de 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 constituer une approche si vous essayez de prendre en charge un grand nombre de variantes de Solaris et Linux.

Mafia Linux

Une recherche plus poussée fera apparaître la page suivante maintenue sur Linuxmafia.com, intitulée: / etc / release équivalents pour diverses distributions Linux (et autres Unix) . 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 votre distribution de logiciel.

En fait, il y a un script au bas de cette page qui fait exactement cela. Ainsi, vous pouvez simplement télécharger et utiliser le script en tant que tierce partie de votre distribution de logiciels.

scénario

#!/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}

NOTE: Ce script doit avoir l’air familier, c’est une version à jour de celle de Novell!

Script de legroom

Une autre méthode que j'ai employée consiste à lancer votre propre script, similaire à la méthode Novell ci-dessus, mais utilisant plutôt LSB. Cet article intitulé: Méthode générique pour déterminer le nom de la distribution Linux (ou UNIX) illustre l'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 un système /etc/bashrcou un fichier de ce type, qui définirait ensuite la variable d'environnement $DISTRO.

gcc

Croyez-le ou non, une autre méthode consiste à utiliser gcc. Si vous interrogez la commande, gcc --versionvous obtiendrez la distribution pour laquelle gcc a été construit, qui est invariablement identique à celle du système sur lequel il est exécuté.

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 devrais-je utiliser? J'aurais tendance à choisir lsb_release -an'importe quelle distribution Linux que je fréquenterais (RedHat, Debian, Ubuntu, etc.). Dans les cas où vous soutenez des systèmes qui ne sont pas fournis, lsb_releaseje créerais mon propre logiciel dans le cadre de la distribution des logiciels que je fournis, similaire à l'un des scripts ci-dessus.

MISE À JOUR N ° 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 un compteur pour un paquet fournissant ce type de fonctionnalité clé.

J'ai donc profité de l'occasion pour contacter une personne du projet OpenSuSE afin de 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 
slm
la source
1
Remarque: Vous venez de faire une vérification rapide sur les machines AIX et SunOS. Il ne semble pas que lsb_release soit installé (et après tout, il s’agit d’un stack Unix et non de Linux). Le problème avec gcc est que certaines personnes commencent maintenant à utiliser Clang. En outre, vous ne pouvez jamais savoir avec certitude quel gcc a été utilisé pour la construction (sur les systèmes avec lesquels je travaille, il y a au moins quelques versions sur chacun). Mon vote va donc à la solution Python, car elle semble être installée partout par défaut.
Elmo
@elmo - Oui, LSB est la base standard Linux. Je ne m'attendrais donc pas à ce que ce soit sous AIX ou SunOS. Mon expérience avec SunOS date de plus de 15 ans et la majorité des fournisseurs dont les logiciels ont été traités fournissaient généralement leur propre script shell similaire à ceux que j'ai mentionnés ci-dessus. Jusqu'à Solaris 11, Python n'était pas une option. Et c’est ce qui en fait un problème difficile à résoudre. Si vous fournissez un logiciel devant être exécuté sous Solaris 9, 10, 11, AIX et quelques distributions Linux (SUSE, Ubntu et RHEL), que faites-vous? Python n'est pas une option, vous avez donc un script shell codé à la main.
slm
@elmo - gcc cependant, une option ne semble pas être aussi attrayante pour moi. Il semble avoir trop de problèmes, je le démontrais simplement comme une option.
slm
@elmo - regardez le code derrière cette fonction, hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Grosse surprise, il utilise LSB!
slm
@slm: J'ai accès à la machine avec SunOS 5.10 (ce qui, je suppose, en fait 10 dans votre liste - je ne connais pas très bien les numéros / conventions de version de Sun) et il dispose d'un Python. J'ai accès à la machine avec AIX 7 et à Python. Les machines Linux l'ont évidemment aussi. Donc, toujours Python ressemble à la plupart des choix portables. En ce qui concerne Sun inférieur à 10, je ne sais pas pourquoi il ne permettrait pas l’installation de Python (certes, l’installation actuelle fait défaut, c’est-à-dire ncurses et ctypes, alors qui sait). Pour ce qui est de Python utilisant LSB, il n’est pas du tout surprenant pour Linux s’il s’agit d’une approche par défaut.
Elmo
16

Étant donné que vous ne pourrez probablement pas installer factersur un serveur distant, vous pouvez imiter sa fonction pour trouver le nom du système d'exploitation. Le code Ruby pour le operatingsystemfait peut être trouvé ici sur pastebin . Fondamentalement, il examine les différents *-releasefichiers et d’autres fichiers pour déterminer le nom du système d’exploitation.

Certains des fichiers qu'il regarde:

/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 (quoique un peu fastidieux) de porter cela dans un script shell POSIX.

Joseph R.
la source
5
"Je suis désolé si vous trouvez des doublons dans cette liste, je l'ai rapidement produite avec grep." ... | uniq?
new123456
@ new123456 Droite. Merci. Le mot clé ici est "rapidement" :)
Joseph R.
Désolé de ne pas accepter cela, mais la réponse de @ slm est trop complète pour être ignorée :).
terdon
3
Qu'en est-il de / etc / os-release?
Yauhen Yakimovich
1
@ new123456 Techniquement, cela devrait être ... | sort -u. uniqne trouve que des éléments uniques adjacents.
Parthian Shot
9

Si vous avez pythoninstallé (peu importe que vous utilisiez Python 3 ou Python 2), vous pouvez connaître le nom de la distribution sans réinventer la roue :

python -c "import platform;print(platform.linux_distribution()[0])"
heinrich5991
la source
Si vous êtes tenté d'utiliser cette option, assurez-vous que votre système d'exploitation est supporté: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Sinon, vous pouvez en ajouter d'autres à la liste: coderwall.com/p/cwrenq
slm
1
Cela ne fonctionnera pas avec les anciennes distributions Linux. Par exemple: SuSE 7.0 avait Python 1.5.2 et le module de plate-forme a été ajouté pas avant l'avènement de Python 2.3 en 2003 ;-)
pefu
6

/etc/issuedevrait contenir les informations de version. Je suis à peu près 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 ne concerne pas uniquement les systèmes Linux), bien qu’il soit "facultatif".


la source
Ah, c'est une bonne suggestion, +1. Cela ne fonctionne peut-être pas toujours, mais The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.il semble que l'administrateur système puisse écrire ce qu'il / elle désire.
terdon
2
/etc/issueest complètement peu fiable. (J'ai vu des systèmes en version XY avec une /etc/issuebannière disant qu'ils étaient YZ après une mauvaise gestion des correctifs. Ils peuvent contenir absolument n'importe quoi.)
Mat
Il est recommandé de remplir ce fichier avec. trucs juridiques comme qui est autorisé à se connecter.
Nils
Recommandé par les directives de sécurité et les auditeurs. Il était une fois un cas de loi où un pirate informatique est parti sans punition, parce qu'il y avait BIENVENUE dans / etc / issue
Nils
@drewbenn la page de manuel dit ce que j'ai cité dans mon premier commentaire: rien ne dit qu'il doit contenir les informations système. C'est souvent le cas.
terdon
6

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

boz
la source
Merci, mais aucune aide en ce qui concerne Unix ou tout autre * nix non-Linux.
terdon
3

J'ai utilisé cette commande shell pour obtenir une chaîne indiquant la distribution de 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 de slm.

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

Cela a fonctionné dans

  • CentOS (centos)
  • RedHat (redhat)
  • Debian (debian)
  • Arche
  • OpenSUSE (OpenSUSE)
  • Fedora (fedora)
  • Ubuntu (debian)
scrutari
la source
Ne for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; donefonctionnerait -il pas aussi bien sur tous? Je ne comprends pas pourquoi vous voudriez d’abord findinsérer tous les fichiers /etc.
terdon
Merci pour vos commentaires, terdon, mais votre commande indique 0 lignes d'au moins cent OS et Fedora
scrutateur
1

SNMP est un protocole assez répandu pour pouvoir être trouvé dans de nombreux types de distributions GNU / Linux et de systèmes UNIX.

L' system.sysDescr.0objet de la MIB SNMPv2 peut vous aider à déterminer le système d'exploitation que vous contactez, à condition qu'un démon SNMP s'exécute sur 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 du logiciel et du logiciel de réseau.

Statut: actuel

Accès: en lecture seule

La snmpget(1)page de manuel explique comment récupérer cette valeur à l'aide d'exemples.

Dawud
la source
L'inconvénient est qu'il s'agit d'une chaîne statique qui n'est pas automatiquement maintenue.
Nils
1

Comme il n'y a pas de moyen courant de le faire, nous avons défini une chaîne de publication via la commande snmp exec.

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

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

Nils
la source
Qui est nous'? Et qu'en est-il d'Unix?
terdon
@terdon nous est notre équipe au travail. Sous Unix, vous pouvez faire de même si l’extension correspondante est compilée dans snmpd.
Nils
Ah, je pensais que vous
faisiez
@terdon Vous commencez à développer des normes de site lorsque vous devez gérer plus de 80 serveurs. Nous avons développé cette méthode pour pouvoir contrôler si le système d'exploitation est obsolète (mineur ou même majeur)
Nils
1

D'après ce que j'ai réussi à tirer de ce fil, vous devriez pouvoir obtenir les informations de tous les systèmes 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
Sammitch
la source
2
ne pas analyser la sortie de ls!
heinrich5991
@ heinrich5991 pourquoi pas?
Sammitch
Techniquement, il n'analyse pas la sortie de ls. Il lexing la sortie de ls. Mais oui ... C'est faux parce que /etc/issuec'est complètement peu fiable. Complètement, totalement, totalement peu fiable. En outre, votre hypothèse selon laquelle personne ne peut placer un fichier non lié au système d'exploitation se terminant par «release» ou «version» est déconseillée.
Parthian Shot
@ParthianShot Donc, vous voulez principalement vous plaindre des deuxième et troisième niveaux de repli au cas où les options les plus fiables ne seraient pas disponibles?
Sammitch
@Sammitch more reliable optionsEh bien, d'une part, il n'y a qu'une seule option. Donc, même en supposant que je suis d'accord avec votre hypothèse selon laquelle c'est plus fiable (ce que je ne fais pas), ne commençons pas à pluraliser les choses. Deuxièmement, si quelqu'un utilisait réellement votre solution et que celle-ci échouait complètement la moitié du temps, elle ne serait pas rassurée par le fait qu'elle échouait dans un "else if". Aucun de mes systèmes ne s'est lsbinstallé par défaut.
Parthian Shot
1

Si une situation l'exige, vous pouvez le savoir à 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 configuré correctement dans votre environnement. Tous les hôtes ont SNMP exécuté avec une configuration de chaînes de communauté appropriée.

xpros
la source
C'est quoi snpwalk? Où puis-je le trouver? En outre, cela n'imprime que "Linux", aucune information de distribution (ce que je veux, je unamepeux me le donner Linux). Cela fonctionne-t-il sur des systèmes d'exploitation autres que Linux? Sous UNIX, BSD ou OSX?
terdon
snmpwalk est un utilitaire de ligne de commande Linux. Il n’imprime pas simplement "Linux", il affiche également la version du noyau, qui est vraiment la seule chose dont vous avez besoin. Si SNMP est configuré sur vos autres hôtes, qu’il s’agisse d’UNIX, BSD, OSX, snmpwalk fonctionnera comme c’est un standard (v1 | v2c | v3), et même sur les hôtes Windows. Voir aussi snmpget ou snmpgetnext.
xpros
Cela semble bien, mais pourriez-vous modifier votre réponse et expliquer où nous pouvons la trouver? Ce n'est pas dans le dépôt Debian par exemple. Veuillez également expliquer ce que cela donne uname -aet comment cela peut me donner le nom de la distribution sur laquelle porte la question. Quoi qu'il en soit, même en supposant qu'il puisse renvoyer ces informations, vu qu'il s'agit d'un utilitaire non standard et qu'il doit être installé, je ne suis pas sûr que cela serait utile ici. L'idée est de se connecter à un système distant et de connaître le système d'exploitation (y compris la distribution s'il s'agit de Linux).
terdon
it also prints the kernel version which is really the only thing you needMais ... c'est le but de cette question. Si c'était vraiment tout ce dont vous aviez besoin, vous pourriez simplement l'utiliser uname -a. Le noyau est une partie importante d'un système d'exploitation, mais ce n'est pas le système d'exploitation dans son ensemble. La mise en forme du système de fichiers et les utilitaires utilisateur (par exemple, le gestionnaire de paquets) importent.
Parthian Shot
1

Utiliser /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 une FAQ par un lien http://0pointer.de/blog/projects/os-release.html fourni gratuitement par @weberjn dans ce commentaire . Je viens d’énumérer ici un argument contre l’utilisation de la lsb_releaseréponse qui, à ce jour, est la réponse la plus votée de 2013.

Il existe déjà l'outil lsb_release pour cela, pourquoi ne l'utilisez-vous pas?Eh bien, c'est une interface très étrange: un script shell que vous devez invoquer (et donc générer de manière asynchrone à partir de votre code C), et ce n'est pas écrit pour être extensible. C'est un paquet optionnel dans de nombreuses distributions, et rien que nous ne serions heureux d'invoquer lors d'un démarrage précoce afin de montrer un message de bienvenue. (Parfois, avec des temps de démarrage inférieurs à une seconde, nous ne voulons vraiment pas invoquer un script shell énorme pour une trivialité telle que 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 est utilisé comme interface pour déterminer la version LSB elle-même, mais pas pour vérifier la distribution ou la version.

Anatoly Techtonik
la source
Merci, mais la réponse acceptée aborde déjà cela dans la citation à la fin, ce qui explique que cela /etc/os-releaseva devenir plus standard. Cependant, ce fichier n’est pas toujours présent sur tous les systèmes, c’est pourquoi la réponse acceptée offre davantage d’alternatives portables. De plus, je ne sais pas pourquoi vous parlez de code C, la question n'est pas d'invoquer quoi que ce soit à C.
terdon
@terdon Je suis juste curieux de savoir quels sont ces systèmes en 2018 où /etc/os-releaseest absent? Je suppose que leur base d'utilisateurs est misérable par rapport aux systèmes où ils lsb_releasene sont pas livrés par défaut. Au moins, je ne pourrais pas utiliser votre réponse acceptée sur Fedora. Quant au commentaire C, ce n’est pas le mien, mais une citation du systemdlien 0pointer.de que j’ai fourni.
anatoly techtonik
Oui, je sais que ce n'est pas à vous. Je me demandais simplement pourquoi vous pensiez qu'une citation sur le code C était pertinente. Et pour autant que je sache, os-releasec'est principalement ou exclusivement une chose sous Linux. Il semble être défini par FreeDesktop.org, donc peut-être que certaines versions d'Unix l'utilisent également, mais je doute que vous le trouviez dans la plupart des systèmes embarqués ou non-graphiques, etc. Enfin, n'oubliez pas que de nombreux endroits toujours utiliser des machines très anciennes pour des raisons de stabilité.
terdon
La citation concerne lsb_releaseet vous pouvez remplacer C par Go et obtenir le même argument. La surcharge d'exécution lsb_releaseest beaucoup plus lourde du point de vue de la sécurité et des performances que le simple traitement d'un fichier statique. Je ne crois pas aux très vieilles machines offrant de la stabilité. Heartbleed et ses amis devraient les avoir emmenés il y a longtemps, alors il suffit d'utiliser/etc/os-release
anatoly techtonik