Angenommen, ich bin bei einem Remote-System angemeldet. Woher weiß ich, was ausgeführt wird? Auf den meisten modernen Linuxen (Linuces?) Haben Sie den lsb_release
Befehl:
$ lsb_release -ic
Distributor ID: LinuxMint
Codename: debian
Was soweit ich das beurteilen kann nur die gleichen Infos gibt wie /etc/lsb-release
. Was ist, wenn diese Datei nicht vorhanden ist? Ich scheine mich zu erinnern, dass der lsb_release
Befehl relativ neu ist. Was ist, wenn ich das Betriebssystem eines älteren Systems haben muss?
Auf jeden Fall lsb
steht für Linux Standard Base
also gehe ich davon aus, dass es auf Nicht-Linux-Unices nicht funktioniert. Soweit ich weiß, gibt es keine Möglichkeit, diese Informationen uname
abzurufen. Wie kann ich diese Informationen auf Systemen abrufen, die nicht verwendet werden lsb_release
?
uname -s
sollte außerhalb von Linux reichen (evtl. für die BSDs rechnen).facter
?facter operatingsystem
sollte tun, was Sie wollen, auf allen Systemenfacter
wurde gemacht, um mit zu arbeiten.facter
Code, der den Namen des Betriebssystems erhält, in Pastebin eingefügt . Finden Sie es hier . Es prüft viele verschiedene Dateien, um den Namen zuverlässig zu erhalten.Antworten:
lsb_release -a
Dies ist wahrscheinlich die beste Option, um diese Informationen herauszufinden und dies auf konsistente Weise zu tun.Geschichte der LSB
Der
lsb
Befehl in diesem Befehl steht für das Projekt Linux Standards Base , ein von der Linux Foundation gesponsertes Rahmenprojekt , das allgemeine Methoden für grundlegende Aufgaben in verschiedenen Linux-Distributionen bereitstellt.Das Projekt ist freiwillig, und Anbieter können sich nur als Benutzer und als Vermittler der verschiedenen Spezifikationen für verschiedene Module, die dazu beitragen, die Standardisierung in den verschiedenen Linux-Distributionen voranzutreiben, an dem Projekt beteiligen.
Auszug aus der Charter
Nützliche Links zu LSB
Kritikpunkte
Es gibt eine Reihe von Problemen mit LSB, die es für Distributionen wie Debian problematisch machen. Die erzwungene Verwendung von RPM ist eine. Weitere Informationen finden Sie im Wikipedia-Artikel .
Novell
Wenn Sie suchen, werden Sie möglicherweise auf eine ziemlich veraltete Seite mit dem Titel stoßen: Erkennen der zugrunde liegenden Linux-Distribution von Novell. Dies ist einer der wenigen Orte, an denen ich eine aktuelle Liste gesehen habe, in der mehrere der wichtigsten Distributionen aufgeführt sind und wie Sie feststellen können, welche zugrunde liegende Distribution Sie verwenden.
Auszug
Auf derselben Seite befindet sich auch ein praktisches Skript, das versucht, das oben Genannte mit nur Vanille-
uname
Befehlen und dem Vorhandensein einer der oben genannten Dateien zu codieren.HINWEIS: Diese Liste ist veraltet, aber Sie können die veralteten Distributionen wie Mandrake leicht aus der Liste streichen und durch Alternativen ersetzen. Diese Art von Skript ist möglicherweise ein Ansatz, wenn Sie versuchen, eine Vielzahl von Solaris- und Linux-Varianten zu unterstützen.
Linux Mafia
Weitere Suchanfragen finden Sie auf der folgenden Seite unter Linuxmafia.com mit dem Titel: / etc / release equivalents für verschiedene Linux-Distributionen (und andere Unix-Distributionen) . Dies ist wahrscheinlich die umfassendste Liste, die ich bisher gesehen habe. Sie können diese Liste mit einer case / switch-Anweisung verschlüsseln und in Ihre Softwareverteilung aufnehmen.
Tatsächlich gibt es am Ende dieser Seite ein Skript, das genau das tut. Sie können das Skript also einfach herunterladen und als Drittanbieter für Ihre Softwareverteilung verwenden.
Skript
HINWEIS: Dieses Skript sollte vertraut aussehen, es ist eine aktuelle Version von Novell!
Skript zur Beinfreiheit
Eine andere Methode, die ich verwendet habe, besteht darin, ein eigenes Skript zu erstellen, ähnlich der obigen Novell-Methode, aber stattdessen LSB zu verwenden. Dieser Artikel mit dem Titel: Generische Methode zur Ermittlung des Linux- (oder UNIX-) Verteilungsnamens zeigt eine solche Methode.
Dieser Codeabschnitt könnte in die
/etc/bashrc
Datei eines Systems oder in eine solche Datei eingefügt werden, die dann die Umgebungsvariable setzt$DISTRO
.gcc
Ob Sie es glauben oder nicht, eine andere Methode ist es, davon Gebrauch zu machen
gcc
. Wenn Sie den Befehl abfragen, erhaltengcc --version
Sie die Distribution, für die gcc erstellt wurde. Diese entspricht in jedem Fall dem System, auf dem es ausgeführt wird.Fedora 14
CentOS 5.x
CentOS 6.x
Ubuntu 12.04
TL; DR;
Also welches sollte ich verwenden? Ich würde dazu tendieren,
lsb_release -a
Linux-Distributionen zu kaufen, die ich häufig verwenden würde (RedHat, Debian, Ubuntu usw.). In Situationen, in denen Sie Systeme unterstützen, die ich nicht zur Verfügunglsb_release
stelle, rolle ich meine eigene als Teil der Verteilung der von mir bereitgestellten Software, ähnlich einem der oben genannten Skripte.UPDATE # 1: Follow-up mit SuSE
Im Gespräch mit @Nils in den Kommentaren unten wurde festgestellt, dass SLES11 aus irgendeinem Grund die Installation von LSB standardmäßig eingestellt hat. Es war nur eine optionale Installation, die für ein Paket, das diese Art von Schlüsselfunktion bietet, als kontraproduktiv erschien.
Deshalb habe ich die Gelegenheit genutzt, jemanden aus dem OpenSuSE-Projekt zu kontaktieren, um herauszufinden, warum.
Auszug aus der E-Mail
Hier ist Robs Antwort
quelle
Da Sie wahrscheinlich nicht in der Lage sind,
facter
auf einem Remote-Server zu installieren , können Sie nachvollziehen, wie der Name des Betriebssystems ermittelt wird. Den Ruby-Code dafüroperatingsystem
finden Sie hier auf Pastebin . Grundsätzlich werden die verschiedenen*-release
Dateien und andere Dateien durchsucht, um den Namen des Betriebssystems zu ermitteln.Einige der Dateien, die es betrachtet:
Es tut mir leid, wenn Sie in dieser Liste Duplikate finden, ich habe sie schnell mit erstellt
grep
. Sollte ziemlich einfach (wenn auch etwas mühsam) sein, dies auf ein POSIX-Shell-Skript zu portieren.quelle
... | uniq
?... | sort -u
.uniq
findet nur benachbarte eindeutige Elemente.Falls Sie
python
installiert haben (egal ob Python 3 oder Python 2), können Sie den Distributionsnamen herausfinden, ohne das Rad neu zu erfinden :quelle
/etc/issue
sollte die Release-Informationen enthalten. Ich bin ziemlich sicher, dass ich es auf Solaris-Systemen gesehen habe. Hier ist die Datei von einem modernen Debian-System:/ etc / issue wird auch im FHS erwähnt (was nicht nur für Linux-Systeme gilt), obwohl es "optional" ist.
quelle
The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.
Es scheint dem Systemadministrator überlassen zu sein, zu schreiben, was er / sie möchte./etc/issue
ist völlig unzuverlässig. (Ich sehe Systeme in Version XY mit einem/etc/issue
Banner, das besagt, dass sie nach einem schlechten Patch-Management YZ waren. Es kann absolut alles enthalten.)Sie können den Namen der Distribution nicht zuverlässig in allen Distributionen mit einem einzigen Befehl ermitteln. Einige sind über / etc / * - release verfügbar, andere über den Befehl 'lsb-release'.
quelle
Ich habe diesen Shell-Befehl verwendet, um eine Zeichenfolge abzurufen, die die Linux-Distribution angibt:
Dieser Befehl basiert auf Antworten von Joseph R. und SLM.
Es sucht nur nach Dateien wie / etc / {osname} -release oder / etc / {osname} _version und gibt einen bestimmten os-Namen aus.
Es hat funktioniert
quelle
for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; done
bei allen gleich gut funktionieren? Ich verstehe nicht, warum Sie zuerstfind
alle Dateien in/etc
.SNMP ist ein allgegenwärtiges Protokoll, das in vielen verschiedenen Arten von GNU / Linux-Distributionen und UNIX-Systemen zu finden ist.
Das
system.sysDescr.0
Objekt in der SNMPv2-MIB können Sie ermitteln , welches Betriebssystem Sie kontaktieren, vorausgesetzt , es ist ein SNMP - Daemon im Zielsystem ausgeführt wird :In der
snmpget(1)
Manpage wird anhand von Beispielen erläutert, wie dieser Wert abgerufen wird.quelle
Da dies nicht allgemein möglich ist, haben wir über den Befehl snmp exec einen Release-String definiert.
Die Aufgabe dieses Befehls ist es, die Distribution und die aktuelle Haupt- / Nebenversion des Betriebssystems auszudrucken.
Auf RH und Clones parsen wir / etc / redhat-release, auf SuSe SuSe-release ...
quelle
Nach dem, was ich aus diesem Thread herausgefunden habe, sollten Sie in der Lage sein, die Informationen von verdammt nahen Systemen abzurufen, die Folgendes verwenden:
quelle
ls
. Er lexiert die Ausgabe vonls
. Aber ja ... Das ist falsch, weil/etc/issue
es völlig unzuverlässig ist. Völlig völlig unzuverlässig. Auch Ihre Annahme, dass niemand eine nicht mit dem Betriebssystem zusammenhängende Datei mit der Endung 'release' oder 'version' ablegen könnte, ist unklug.more reliable options
Nun, zum einen gibt es nur eine Option. Selbst wenn ich Ihrer Annahme zustimme, dass es zuverlässiger ist (was ich nicht tue), sollten wir nicht damit beginnen, Dinge zu pluralisieren. Zweitens würde jemand, der Ihre Lösung tatsächlich verwendet hat und die Hälfte der Zeit völlig gescheitert ist, nicht von der Tatsache getröstet sein, dass sie in einem "sonst wenn" gescheitert ist. Keines meiner Systemelsb
wurde standardmäßig installiert.Wenn eine Situation dies erfordert, können Sie dies mit snmpwalk [oder dem SNMP-Protokoll im Allgemeinen] aus der Ferne herausfinden. Ein Beispiel ist unten:
OUPUT: sysDescr.0 = STRING: Linux example.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP Sat 14 05:32:37 EDT 2013 x86_64
Der Schlüssel zur Zuverlässigkeit ist, ob SNMP in Ihrer Umgebung korrekt eingerichtet ist und ob auf allen Hosts snmp mit der richtigen Einrichtung für Community-Strings ausgeführt wird.
quelle
snpwalk
? Wo kann ich es finden? Außerdem druckt das nur "Linux", keine Distributionsinformationen (was ich will,uname
kann mir gebenLinux
). Funktioniert es auf Nicht-Linux-Betriebssystemen? Sagen wir unter UNIX oder BSD oder OSX?uname -a
und wie es mir den Namen der Distribution mitteilen kann, um die es in dieser Frage geht. Selbst wenn diese Informationen zurückgegeben werden können, da es sich um ein nicht standardmäßiges Dienstprogramm handelt, das installiert werden muss, bin ich mir nicht sicher, ob es hier nützlich wäre. Die Idee ist, sich bei einem Remote-System anzumelden und das Betriebssystem (einschließlich der Distribution, wenn es sich um Linux handelt) herauszufinden.it also prints the kernel version which is really the only thing you need
Aber ... das ist der springende Punkt dieser Frage. Wenn das wirklich alles war, was du brauchst, könntest du es einfach benutzenuname -a
. Der Kernel ist ein wichtiger Bestandteil eines Betriebssystems, aber nicht das gesamte Betriebssystem. Dateisystemlayout und Userland-Dienstprogramme (z. B. Paketmanager) sind wichtig.Verwendung
/etc/os-release
:Die Gründe werden in einer FAQ durch einen von @weberjn in diesem Kommentar zur Verfügung gestellten Link http://0pointer.de/blog/projects/os-release.html gut erklärt . Ich führe hier nur ein Argument gegen die Verwendung der oben genannten Antwort aus dem Jahr 2013 auf.
lsb_release
quelle
/etc/os-release
mehr zum Standard werden wird. Diese Datei ist jedoch nicht immer auf allen Systemen vorhanden, weshalb die akzeptierte Antwort portablere Alternativen bietet. Auch ich weiß nicht , warum Sie C - Code sind zu erwähnen, ist die Frage nicht über alles von C. Aufruf/etc/os-release
fehlen? Ich vermute, dass ihre Nutzerbasis im Vergleich zu Systemen, dielsb_release
nicht standardmäßig ausgeliefert werden, miserabel ist. Zumindest konnte ich Ihre akzeptierte Antwort auf Fedora nicht verwenden. Was den C-Kommentarsystemd
betrifft , so ist es nicht mein, sondern ein von mir angegebener Link von 0pointer.de.os-release
handelt es sich meistens oder ausschließlich um eine Linux-Sache. Es scheint von FreeDesktop.org definiert zu sein, daher wird es möglicherweise auch von einigen Unix-Versionen verwendet, aber ich bezweifle, dass Sie es in den meisten oder in eingebetteten Systemen oder in anderen Systemen ohne grafische Benutzeroberfläche usw. finden Verwenden Sie aus Stabilitätsgründen immer noch sehr alte Maschinen.lsb_release
und Sie können C durch Go ersetzen und das gleiche Argument erhalten. Der Aufwand für die Ausführunglsb_release
ist sowohl unter Sicherheits- als auch unter Leistungsaspekten wesentlich höher als das einfache Analysieren statischer Dateien. Ich glaube nicht an sehr alte Maschinen, die für Stabilität sorgen. Heartbleed und Freunde hätten sie schon längst/etc/os-release