Bestimmen Sie die Linux-Distribution

11

Ich versuche festzustellen, welche Version von Linux Server ausgeführt wird. Ich versuche nicht, die Kernel-Version zu bestimmen, sondern den Distributor zu bewerten.

gcc ist installiert und in der Versionsausgabe steht RedHat

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

Bedeutet dies, dass ich davon ausgehen kann, dass mein Server ein RedHat-Server ist? Gibt es eine bessere - 100% kugelsichere Methode, um dies herauszufinden? Auch für andere Linux-Varianten - nicht nur für diesen Server?

Bearbeiten: Inhalt von /etc/falls es hilft - aber ich möchte eine Lösung, die auch für andere Linux-Versionen funktioniert.

# 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

Ich habe keine *releaseoder *versionDateien 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

Ich habe LSB ausprobiert

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

Außerdem - ich glaube, ich bin in einem chroot jail(nicht wirklich sicher, was das ist), was wahrscheinlich die Ursache für dieses Problem sein könnte.


Aktualisiert:

Ich denke, das macht es für mich. Ich glaube, ich kann davon ausgehen, dass ich Cent-OS verwende.

# cat /proc/version
Linux version 2.6.9-103.plus.c4smp ([email protected]) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)) #1 SMP Wed Dec 21 16:17:23 EST 2011
Billy Moon
quelle
Warum willst du das wissen? Vielleicht macht das Testen auf gängige verteilungsspezifische Tools (z. B. Paketmanager) das, was Sie wollen?
Daniel Pryden
1
Nun, ich möchte wirklich wissen, ob ich den Server lokal als virtuelle Maschine replizieren und dann Dinge auf der lokalen virtuellen Maschine installieren und dann die Binärdateien auf die Remote-Maschine kopieren kann. Ich dachte, die richtige Plattform herauszufinden wäre ein guter Ausgangspunkt.
Billy Moon
2
Die obige Verzeichnisliste ist unvollständig (zB fehlen Hosts, init.d, rc *). Ist das ein Test?
Wie greifen Sie auf diesen Server zu? Ist es möglich, dass Sie nicht direkt auf das Dateisystem des Servers zugreifen können, sondern sich stattdessen in einem Chroot-Gefängnis befinden?
Daniel Pryden
Ich denke, ich könnte in einem Chroot-Gefängnis sein - bedeutet das, dass ich nicht herausfinden kann, was das zugrunde liegende System ist?
Billy Moon

Antworten:

4
cat /proc/version

Beispiele:

  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 ([email protected]) \
    (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Apr 17 23:56:34 BST 2012
    

Siehe auch Woher wissen Sie, welche Linux-Distribution Sie verwenden?

vitaut
quelle
Dies zeigt, wo der Kernel kompiliert wurde und nicht auf welcher Distribution Sie ausgeführt werden. In vielen Fällen wird der Kernel auf derselben Distribution kompiliert, jedoch auf einer älteren Version.
Pabouk
13

In den meisten modernen Linux-Distributionen gibt Ihnen der folgende Befehl Informationen:

lsb_release -a
Alpha01
quelle
1
Nein, das ist nicht wahr. Dies funktioniert nur für Debian und Derivate
MariusMatutiae
1
Dieser Befehl wird standardmäßig nicht auf Red Hat und Derivaten (z. B. CentOS) installiert. Sie müssen es vor der Verwendung explizit installieren : yum install redhat-lsb-core.
Pabouk
@MariusMatutiae ist eigentlich viel weiter verbreitet, wird aber nicht immer standardmäßig installiert.
Terdon
@terdon danke, das wusste ich nicht.
Marius Matutiae
@MariusMatutiae siehe hier für weitere Informationen, es scheint in SuSe nicht vorhanden zu sein, sollte aber auf RH installiert werden.
Terdon
9

/etc/issue könnte ein guter Ausgangspunkt sein.

Weitere Informationen finden Sie in den Info-Dateien auf verschiedene Distributionen:

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

Weitere Informationen finden Sie im Unix-Forum .

e_z
quelle
1
Leider habe ich keine Dateien, die enden releaseoder versionin meinem etcVerzeichnis
Billy Moon
4

Wenn /etc/issuees fehlt, sind möglicherweise eine oder mehrere /etc/*_releaseDateien vorhanden.

Zum Beispiel hat mein Ubuntu-System /etc/lsb-release:

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

Das CentOS-System eines Freundes (basierend auf Red Hat) hat /etc/redhat-release:

CentOS release 5.6 (Final)

Ich weiß nicht, wie universell das ist.

Keith Thompson
quelle
nein releaseoder versionDateien in meinem/etc/
Billy Moon
@BillyMoon Ich glaube, Linux-Distributionen haben erst vor kurzem damit begonnen, das Dienstprogramm lsb_release zu ihrer Distribution hinzuzufügen. lsb_release -a
Alpha01
Danke für den Tipp - hilft mir diesmal leider nicht
Billy Moon
2

cat / etc / issue könnte Ihre Frage beantworten.

Die Distributoren sind hier nicht freundlich zu Ihnen. Erstens denkt jeder, dass dies der einzig wahre Weg ist.

Anstatt zu versuchen, an der Distribution zu schnüffeln, sollten Sie sich höchstwahrscheinlich die spezielle Frage genauer ansehen, die Sie tatsächlich beantworten müssen. Konzentrieren Sie sich auf die Funktionalität, die Sie sich ansehen, nicht auf die Distribution, die sie bereitstellt. Schließlich kann sich eine neue Version einer Distribution umdrehen und auf einer bestimmten Achse in die entgegengesetzte Richtung gehen.

bmargulies
quelle
3
Es gibt keine /etc/issueauf meinem Server
Billy Moon
Ja. Beachten Sie, dass /etc/issueEscape-Sequenzen wie \nund enthalten können \l. Um zu sehen, was diese bedeuten, man 5 issueund man getty(die /etc/issueDatei ist hauptsächlich für die Verwendung durch bestimmt getty). Natürlich könnte der Besitzer des Systems /etc/issueaus irgendeinem schändlichen Grund bearbeiten .
Keith Thompson
Ich denke nicht, dass /etc/issuees erforderlich ist, zu existieren oder Informationen über den Distributionsanbieter zu enthalten. Das ist normalerweise der Fall, aber ich glaube nicht, dass Sie sich darauf verlassen können.
Daniel Pryden
@ DanielPryden gut man lernt jeden Tag etwas. Ich würde noch nie zuvor auf die Abwesenheit eines Menschen stoßen.
Bmargulies
1

Verwenden Sie facter(ja, so wird es geschrieben).

Facter ist ein Begleiter der Marionette. Es bietet abfragbare Variablen, die Informationen über das System enthalten.

Hier sind zum Beispiel nur einige der Dutzenden von Variablen, die der Faktor zurückgeben kann

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

Sie können einfach die osfamily-Tatsache abfragen, um festzustellen, ob auf dem Server RedHat ausgeführt wird

$ facter osfamily
RedHat

Lesen Sie die Dokumentation: http://puppetlabs.com/facter

Spuder
quelle
0

uname -a

Funktioniert immer für jeden Tux

Fauler Dachs
quelle
1
Darin wird die Kernel- Versionszeichenfolge gemeldet, die sehr falsch sein kann, wenn Ihr Host einen Kernel von einer anderen Distribution aus ausführt - entweder auf Bare-Metal-Basis oder aufgrund eines Tools wie OpenVZ oder VServers.
Sarnold
Ja, aber ich nehme an, in diesem Fall wird der Autor von Q etw wissen. über die Situation. "Fremder" Kernel ist ein ziemlich seltsamer Fall
Lazy Badger
0

Es gibt keinen einzigen sicheren Weg, dies zu tun. Ich habe eine ähnliche Frage zu unix.se gestellt. Der beste Weg, um diese Informationen zu erhalten, ist ein Skript, das eine Vielzahl von Quellen überprüft:

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

Die andere Wahl ist in der Tat gcc --version, da dies gccimmer für eine bestimmte Distribution kompiliert wird, wird dies relativ portabel sein. Ich empfehle Ihnen dringend, die akzeptierte Antwort auf meine Frage bei U & L zu lesen . Sie erklärt die Situation sehr gut.

Terdon
quelle
0

Dieser Befehl funktionierte für Debian- und Redhat-basierte Distributionen: Mit dem Filter tr konvertieren Sie das Dokument in ein Ein-Wort-pro-Zeile-Format und zählen dann die erste Zeile, die den Distributionsnamen enthält.

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

Das ist die beste Methode

cat /etc/*release
Unnikrishnan
quelle
Ich habe mein /etcVerzeichnis in der Frage aufgelistet . Wie in anderen Antworten erläutert, funktioniert diese Lösung bei mir nicht.
Billy Moon
Du hast versucht, ls / etc * freizugeben; . Es ist falsch. Versuchen Sie es mit ls / etc / * release. Es wird funktionieren. Ich bin mir ziemlich sicher
Unnikrishnan
Ich habe auch ls im /etc/Verzeichnis und Sie können sehen, dass keine Dateien dort enden inrelease
Billy Moon