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_release
commande:
$ 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_release
commande 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 lsb
signifie Linux Standard Base
que 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, uname
alors comment puis-je l’obtenir sur des systèmes inutilisés lsb_release
?
uname -s
devrait être suffisant en dehors de Linux (peut-être pour les BSD).facter
?facter operatingsystem
devrait faire ce que vous voulez sur tous les systèmes afacter
été fait pour travailler avec.facter
code 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.Réponses:
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
lsb
commande 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
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
Cette même page inclut également un script pratique qui tente de codifier ce qui précède à l’aide de
uname
commandes 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
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.
Ce morceau de code pourrait être inclus dans un système
/etc/bashrc
ou 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 --version
vous 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
CentOS 5.x
CentOS 6.x
Ubuntu 12.04
TL; DR;
Alors, lequel devrais-je utiliser? J'aurais tendance à choisir
lsb_release -a
n'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_release
je 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
Voici la réponse de Rob
la source
Étant donné que vous ne pourrez probablement pas installer
facter
sur un serveur distant, vous pouvez imiter sa fonction pour trouver le nom du système d'exploitation. Le code Ruby pour leoperatingsystem
fait peut être trouvé ici sur pastebin . Fondamentalement, il examine les différents*-release
fichiers et d’autres fichiers pour déterminer le nom du système d’exploitation.Certains des fichiers qu'il regarde:
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.la source
... | uniq
?... | sort -u
.uniq
ne trouve que des éléments uniques adjacents.Si vous avez
python
installé (peu importe que vous utilisiez Python 3 ou Python 2), vous pouvez connaître le nom de la distribution sans réinventer la roue :la source
/etc/issue
devrait 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:/ etc / issue est également mentionné dans le FHS (qui ne concerne pas uniquement les systèmes Linux), bien qu’il soit "facultatif".
la source
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./etc/issue
est complètement peu fiable. (J'ai vu des systèmes en version XY avec une/etc/issue
bannière disant qu'ils étaient YZ après une mauvaise gestion des correctifs. Ils peuvent contenir absolument n'importe quoi.)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'.
la source
J'ai utilisé cette commande shell pour obtenir une chaîne indiquant la distribution de Linux:
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
la source
for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; done
fonctionnerait -il pas aussi bien sur tous? Je ne comprends pas pourquoi vous voudriez d’abordfind
insérer tous les fichiers/etc
.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.0
objet 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
snmpget(1)
page de manuel explique comment récupérer cette valeur à l'aide d'exemples.la source
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 ...
la source
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:
la source
ls
. Il lexing la sortie dels
. Mais oui ... C'est faux parce que/etc/issue
c'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.more reliable options
Eh 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'estlsb
installé par défaut.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:
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.
la source
snpwalk
? Où puis-je le trouver? En outre, cela n'imprime que "Linux", aucune information de distribution (ce que je veux, jeuname
peux me le donnerLinux
). Cela fonctionne-t-il sur des systèmes d'exploitation autres que Linux? Sous UNIX, BSD ou OSX?uname -a
et 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).it also prints the kernel version which is really the only thing you need
Mais ... c'est le but de cette question. Si c'était vraiment tout ce dont vous aviez besoin, vous pourriez simplement l'utiliseruname -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.Utiliser
/etc/os-release
: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_release
réponse qui, à ce jour, est la réponse la plus votée de 2013.la source
/etc/os-release
va 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./etc/os-release
est absent? Je suppose que leur base d'utilisateurs est misérable par rapport aux systèmes où ilslsb_release
ne 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 dusystemd
lien 0pointer.de que j’ai fourni.os-release
c'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é.lsb_release
et vous pouvez remplacer C par Go et obtenir le même argument. La surcharge d'exécutionlsb_release
est 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