Déterminer la distribution Linux


11

J'essaie de déterminer quelle version du serveur Linux est en cours d'exécution. Je n'essaie pas de déterminer la version du noyau - mais d'évaluer le distributeur.

gcc est installé, et dans la sortie de la version, il dit RedHat

# gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11)

Est-ce que cela signifie que je peux supposer en toute sécurité que mon serveur est un serveur RedHat. Existe-t-il une meilleure méthode 100% pare-balles pour le savoir? Aussi pour d'autres versions de Linux - pas seulement ce serveur?

Edit: contenu de /etc/au cas où cela aiderait - mais je voudrais une solution qui fonctionne aussi pour d'autres versions de linux.

# ls /etc/
./              backupmxhosts  domainusers     host.conf     localdomains  mailips        pam.d/      relayhosts               shadow              trustedmailhosts
../             bashrc*        exim.conf       inputrc       localtime     man.config     passwd      resolv.conf              skipsmtpcheckhosts  userdomains
DIR_COLORS      cron.deny      exim.pl         ld.so.cache   lynx.cfg      mtab           profile     secondarymx              spammeripblocks     vimrc
aliases         demodomains    exim.pl.local*  ld.so.conf    mail/         my.cnf         profile.d/  senderverifybypasshosts  sudoers
antivirus.exim  demouids       group           localaliases  mailhelo      nsswitch.conf  protocols   services                 termcap

Je n'ai aucun fichier *releaseou*version/etc/

# ls /etc*release; ls /etc/*version
/bin/ls: /etc/*release: No such file or directory
/bin/ls: /etc/*version: No such file or directory

J'ai essayé LSB

# lsb_release -a
LSB Version:
Distributor ID: n/a
Description:    (none)
Release:        n/a
Codename:       n/a

Aussi - je suppose que je suis à l'intérieur d'un chroot jail(pas vraiment sûr de ce que c'est) qui pourrait probablement être la cause de ce problème.


Mis à jour:

Je pense que cela le fait pour moi. Je pense que je peux supposer en toute sécurité que j'utilise cent-os.

# cat /proc/version
Linux version 2.6.9-103.plus.c4smp (mockbuild@builder10.centos.org) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)) #1 SMP Wed Dec 21 16:17:23 EST 2011

Pourquoi avez-vous besoin de savoir? Peut-être que tester des outils spécifiques à la distribution (gestionnaires de packages, par exemple) fera ce que vous voulez?
Daniel Pryden

1
Eh bien, ce que je veux vraiment savoir, c'est si je peux répliquer le serveur en tant que machine virtuelle localement, puis installer des éléments sur la machine virtuelle locale, puis copier les fichiers binaires sur la machine distante. Je pensais que trouver la bonne plateforme serait un bon point de départ.
Billy Moon

2
La liste de répertoires ci-dessus est incomplète (par exemple, les hôtes sont manquants, init.d, rc *). Est-ce un test?

Comment accédez-vous à ce serveur? Est-il possible que vous n'ayez pas accès directement au système de fichiers du serveur, mais que vous vous trouviez plutôt dans une prison chroot?
Daniel Pryden

Je suppose que je pourrais être dans une prison chroot - cela signifie-t-il que je ne peux pas savoir quel est le système sous-jacent?
Billy Moon

Réponses:


4
cat /proc/version

Exemples:

  1. Ubuntu:

    $ cat /proc/version
    Linux version 3.11.0-13-generic (buildd@roseapple) (gcc version 4.8.1 \
    (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013
    
  2. Red Hat / CentOS:

    $ cat /proc/version
    Linux version 2.6.32-220.13.1.el6.x86_64 (mockbuild@c6b6.bsys.dev.centos.org) \
    (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Apr 17 23:56:34 BST 2012
    

Voir aussi Comment savoir quelle distribution Linux vous utilisez?


Cela montre où le noyau a été compilé et non sur quelle distribution vous l'exécutez. Dans de nombreux cas, le noyau est compilé sur la même distribution mais sur une version plus ancienne.
pabouk

13

Sur la plupart des distributions Linux modernes, la commande suivante vous donnera ses informations:

lsb_release -a

1
Non, ce n'est pas vrai. Cela ne fonctionne que pour Debian et dérivés
MariusMatutiae

1
Cette commande n'est pas installée par défaut sur Red Hat et ses dérivés (c'est-à-dire CentOS). Vous devez installer explicitement avant l' utilisation: yum install redhat-lsb-core.
pabouk

@MariusMatutiae est en fait beaucoup plus répandu que cela mais n'est pas toujours installé par défaut.
terdon

@terdon merci, je ne le savais pas.
MariusMatutiae

@MariusMatutiae voir ici pour plus d'informations, il semble être absent de SuSe mais devrait être installé sur RH.
terdon

9

/etc/issue pourrait être un bon point de départ.

Pour en savoir plus, inspectez les fichiers d'informations pour les différentes distributions:

Novell SuSE    /etc/SuSE-release
OpenSuSE       /etc/SuSE-release, /etc/os-release
Red Hat,CentOS /etc/redhat-release, /etc/redhat_version
Fedora         /etc/fedora-release, /etc/redhat-release, /etc/os-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
Amazon Linux   /etc/system-release
PLD Linux      /etc/pld-release, /etc/os-release
ArchLinux      /etc/arch-release, /etc/os-release

Voir le forum Unix pour plus de détails.


1
malheureusement, je n'ai aucun fichier se terminant releaseou versiondans mon etcrépertoire
Billy Moon

4

S'il /etc/issueest manquant, il peut y avoir un ou plusieurs /etc/*_releasefichiers.

Par exemple, mon système Ubuntu a /etc/lsb-release:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.04
DISTRIB_CODENAME=natty
DISTRIB_DESCRIPTION="Ubuntu 11.04"

Le système CentOS d'un ami (basé sur Red Hat) a /etc/redhat-release:

CentOS release 5.6 (Final)

Je ne sais pas à quel point c'est universel.


no releaseor versionfiles in my/etc/
Billy Moon

@BillyMoon Je pense que ce n'est que récemment que les distributions Linux ont commencé à ajouter l'utilitaire lsb_release sur leur distribution. lsb_release -a
Alpha01

Merci pour l'astuce - ne m'aide pas cette fois malheureusement
Billy Moon

2

cat / etc / issue pourrait répondre à votre question.

Les fabricants de distribution ne sont pas amicaux avec vous ici. Premièrement, chacun pense que c'est la seule vraie voie.

Très probablement, au lieu d'essayer de flairer la distribution, vous devriez regarder plus en détail la question particulière à laquelle vous devez réellement répondre. Concentrez-vous sur la fonctionnalité que vous regardez, pas sur la distribution qui la fournit. Après tout, une nouvelle version d'une distribution peut se retourner et aller dans la direction opposée sur un axe particulier.


3
il n'y a pas /etc/issuesur mon serveur
Billy Moon

Oui. Notez que /etc/issuepeut contenir des séquences d'échappement telles que \net \l. Pour voir ce que cela signifie, man 5 issueet man getty(le /etc/issuefichier est principalement destiné à être utilisé par getty). Bien sûr, le propriétaire du système pourrait modifier /etc/issuepour une raison néfaste.
Keith Thompson

Je ne pense pas qu'il /etc/issuesoit nécessaire d'exister ou de contenir des informations sur le fournisseur de distribution. C'est généralement le cas, mais je ne pense pas que vous puissiez vous y fier.
Daniel Pryden

@DanielPryden et bien on apprend quelque chose tous les jours. Je n'avais jamais rencontré personne auparavant.
bmargulies

1

Utilisez facter(oui, c'est ainsi qu'il est orthographié).

Facter est un compagnon de marionnette, il fournit des variables pouvant être interrogées qui contiennent des informations sur le système.

Par exemple, voici quelques-unes des dizaines de variables que le facteur peut renvoyer

$ facter
...
operatingsystem => CentOS
operatingsystemmajrelease => 6
operatingsystemrelease => 6.4
osfamily => RedHat
...

Vous pouvez simplement interroger le fait osfamily pour voir que le serveur exécute RedHat

$ facter osfamily
RedHat

Consultez la documentation: http://puppetlabs.com/facter


0

uname -a

Fonctionne toujours pour n'importe quel Tux


1
Cela rapporte la chaîne de version du noyau , ce qui pourrait être très faux si votre hôte exécute un noyau à partir d'une distribution différente - soit sur du métal nu, soit à cause d'un outil comme OpenVZ ou VServers.
sarnold

Oui, mais je suppose que dans ce cas, l'auteur de Q saura smth. sur la situation. Le noyau "étranger" est un cas plutôt étrange
Lazy Badger

0

Il n'y a pas un seul moyen sûr de le faire. J'ai posé une question similaire sur unix.se et la meilleure façon d'obtenir ces informations est un script qui vérifie une variété de sources:

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

L'autre choix est en effet d'utiliser gcc --version, car gccest toujours compilé pour une distribution particulière, ce sera relativement portable. Je vous recommande fortement de lire la réponse acceptée à ma question chez U&L, cela explique très bien la situation.


0

Cette commande a fonctionné pour les distributions basées sur Debian et Redhat: à l'aide du filtre tr, vous convertissez le document au format un mot par ligne, puis comptez la première ligne qui contient le nom de la distribution.

tr -s ' \011' '\012' < /etc/issue | head -n 1

-1

C'est la meilleure méthode

cat /etc/*release

J'ai listé mon /etcannuaire dans la question. Comme discuté sur d'autres réponses, cette solution ne fonctionne pas pour moi.
Billy Moon

U a essayé la version ls / etc *; . Il est faux. Essayez la version ls / etc / *. Cela fonctionnera .am assez sûr
Unnikrishnan

J'ai également fait ls dans le /etc/répertoire et vous pouvez voir qu'aucun fichier ne s'y terminerelease
Billy Moon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.