Determina la distribuzione Linux


11

Sto cercando di determinare quale sapore del server Linux è in esecuzione. Non sto cercando di determinare la versione del kernel, ma di valutare il distributore.

gcc è installato e nell'output della versione, dice RedHat

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

Questo significa che posso tranquillamente presumere che il mio server sia un server RedHat. Esiste un metodo migliore - 100% antiproiettile per scoprirlo? Anche per altre versioni di Linux - non solo questo server?

Modifica: il contenuto di /etc/nel caso in cui aiuta - ma vorrei una soluzione che funzioni anche per altre versioni di 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

Non ho *releaseo *versionfile in/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

Ho provato LSB

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

Inoltre - Immagino di essere all'interno di un chroot jail(non proprio sicuro di cosa si tratti) che potrebbe essere la causa di questo problema.


aggiornato:

Penso che questo lo faccia per me. Penso di poter tranquillamente presumere che sto usando 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

Perché devi saperlo? Forse invece testare strumenti comuni specifici per la distribuzione (gestori di pacchetti, per esempio) farà quello che vuoi?
Daniel Pryden,

1
Bene, quello che voglio davvero sapere è se posso replicare il server come una macchina virtuale localmente e quindi installare roba sulla macchina virtuale locale, quindi copiare i binari sulla macchina remota. Ho pensato che scoprire la piattaforma corretta sarebbe stato un buon punto di partenza.
Billy Moon,

2
L'elenco di directory sopra è incompleto (ad es. Host mancante, init.d, rc *). È un test?

Come stai accedendo a questo server? È possibile che tu non abbia accesso diretto al filesystem del server, ma sia invece all'interno di una prigione chroot?
Daniel Pryden,

Immagino di poter essere in una prigione chroot - questo significa che non riesco a scoprire quale sia il sistema sottostante?
Billy Moon,

Risposte:


4
cat /proc/version

Esempi:

  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
    

Vedi anche Come sapere quale distribuzione Linux stai usando?


Questo mostra dove è stato compilato il kernel e non su quale distribuzione si esegue. In molti casi il kernel viene compilato sulla stessa distribuzione ma su una versione precedente.
pabouk,

13

Sulla maggior parte delle distro Linux moderne, il seguente comando ti darà le sue informazioni:

lsb_release -a

1
No, questo non è vero. Questo funziona solo per Debian e derivati
MariusMatutiae,

1
Questo comando non è installato di default su Red Hat e derivati ​​(es. CentOS). È necessario installare in modo esplicito prima dell'uso: yum install redhat-lsb-core.
pabouk,

@MariusMatutiae in realtà è molto più diffuso di così, ma non è sempre installato di default.
terdon,

@terdon grazie, non lo sapevo.
MariusMatutiae,

@MariusMatutiae vedi qui per maggiori informazioni, sembra essere assente da SuSe ma dovrebbe essere installato su RH.
terdon,

9

/etc/issue potrebbe essere un buon punto di partenza.

È possibile trovare ulteriori informazioni ispezionando i file di informazioni per diverse distribuzioni:

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

Vedi il forum Unix per maggiori dettagli.


1
purtroppo non ho alcun file che termina releaseo versionnella mia etcdirectory
Billy Moon,

4

Se /etc/issuemanca, potrebbero esserci uno o più /etc/*_releasefile.

Ad esempio, il mio sistema Ubuntu ha /etc/lsb-release:

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

Il sistema CentOS di un amico (basato su Red Hat) ha /etc/redhat-release:

CentOS release 5.6 (Final)

Non so quanto sia universale.


no releaseo versionfile nel mio/etc/
Billy Moon,

@BillyMoon Credo che sia recente che le distribuzioni Linux abbiano iniziato ad aggiungere l'utility lsb_release alla loro distribuzione. lsb_release -a
Alpha01

Grazie per la punta - questa volta non mi aiuta purtroppo
Billy Moon,

2

cat / etc / issue potrebbe rispondere alla tua domanda.

I produttori di distro non sono cordiali con te qui. Innanzitutto, ognuno pensa che sia l'unico vero modo.

Molto probabilmente, invece di cercare di annusare la distribuzione, dovresti guardare più in dettaglio alla particolare domanda a cui devi effettivamente rispondere. Concentrati sulla funzionalità che stai guardando, non sulla distribuzione che la fornisce. Dopotutto, una nuova versione di una distro può girarsi e andare nella direzione opposta su qualsiasi asse particolare.


3
non ce n'è /etc/issuesul mio server
Billy Moon,

Sì. Nota che /etc/issuepuò contenere sequenze di escape come \ne \l. Per vedere cosa significano questi man 5 issuee man getty(il /etc/issuefile è principalmente destinato all'uso da getty). Naturalmente il proprietario del sistema potrebbe modificare /etc/issueper qualche motivo nefasto.
Keith Thompson,

Non credo /etc/issuesia necessario esistere o contenere alcuna informazione sul fornitore di distribuzione. Lo fa comunemente, ma non credo che tu possa fare affidamento su di esso.
Daniel Pryden,

@DanielPryden bene si impara qualcosa ogni giorno. Non avrei mai incontrato l'assenza di me stesso prima.
bmargulies,

1

Usa facter(sì, è così che si scrive).

Facter è un compagno di marionette, fornisce variabili che possono essere interrogate che contengono informazioni sul sistema.

Ad esempio, qui ci sono solo alcune delle dozzine di variabili che il fattore può restituire

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

Si potrebbe semplicemente interrogare il fatto osfamily per vedere che il server esegue RedHat

$ facter osfamily
RedHat

Consulta la documentazione: http://puppetlabs.com/facter


0

uname -a

Funziona sempre per qualsiasi Tux


1
Ciò riporta la stringa di versione del kernel , che potrebbe essere molto sbagliata se l'host esegue un kernel da una distribuzione diversa, sia su bare metal sia a causa di uno strumento come OpenVZ o VServers.
Sarnold,

Sì, ma suppongo che in questo caso l'autore di Q conoscerà smth. sulla situazione. Il kernel "Foreign" è un caso piuttosto strano
Lazy Badger,

0

Non esiste un unico modo sicuro per farlo. Ho fatto una domanda simile su unix.se e il modo migliore per ottenere queste informazioni è uno script che controlla una varietà di fonti:

#!/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'altra scelta sta effettivamente usando gcc --version, poiché gccè sempre compilata per una particolare distribuzione, questa sarà relativamente portatile. Consiglio vivamente di leggere la risposta accettata sulla mia domanda in U&L che spiega molto bene la situazione.


0

Questo comando ha funzionato per le distribuzioni basate su Debian e basate su Redhat: Usando il filtro tr, converti il ​​documento nel formato di una parola per riga e quindi conti la prima riga che contiene il nome della distribuzione.

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

-1

Questo è il metodo migliore

cat /etc/*release

Ho elencato la mia /etcdirectory nella domanda. Come discusso su altre risposte, questa soluzione non funziona per me.
Billy Moon,

Hai provato a rilasciare ls / etc *; . È sbagliato. Prova ls / etc / * release. Funzionerà .am abbastanza sicuro
Unnikrishnan,

Ho anche fatto ls nella /etc/directory e puoi vedere che nessun file lì dentro finisce inrelease
Billy Moon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.