Lösung 1:
Es gibt keinen Querverteilungsweg. Allerdings:
- Redhat und Freunde:Test auf
/etc/redhat-release
, Inhalt prüfen- Debian:Test auf
/etc/debian_version
, Inhalt prüfen- Mandriva und Freunde:Test auf
/etc/version
, Inhalt prüfen- Slackware:Test auf
/etc/slackware-version
, Inhalt prüfen
Usw. Suchen Sie im Allgemeinen nach /etc/*-release
und /etc/*-version
.
Bearbeiten:Ich habe ein altes (1+ Jahre) Bash-Skript von mir herumliegend gefunden, das ich im Laufe der Jahre zusammengeschustert haben muss (es hat ein beeindruckendes CVS-Protokoll, das 6 Jahre zurückreicht). Machen Sie sich nicht die Mühe, installierte Distributionen zum Testen zu finden, aber es sollte Ihnen einen guten Ausgangspunkt bieten. Es funktioniert gut auf CentOS, Fedora und Gentoo. gyaresu hat es erfolgreich auf Debian Lenny getestet.
#!/bin/bash
get_distribution_type()
{
local dtype
# Assume unknown
dtype="unknown"
# First test against Fedora / RHEL / CentOS / generic Redhat derivative
if [ -r /etc/rc.d/init.d/functions ]; then
source /etc/rc.d/init.d/functions
[ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"
# Then test against SUSE (must be after Redhat,
# I've seen rc.status on Ubuntu I think? TODO: Recheck that)
elif [ -r /etc/rc.status ]; then
source /etc/rc.status
[ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"
# Then test against Debian, Ubuntu and friends
elif [ -r /lib/lsb/init-functions ]; then
source /lib/lsb/init-functions
[ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"
# Then test against Gentoo
elif [ -r /etc/init.d/functions.sh ]; then
source /etc/init.d/functions.sh
[ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"
# For Slackware we currently just test if /etc/slackware-version exists
# and isn't empty (TODO: Find a better way :)
elif [ -s /etc/slackware-version ]; then
dtype="slackware"
fi
echo $dtype
}
Beachten Sie, dass dies wahrscheinlich nur in Bash korrekt funktioniert. Sie könnten es für andere Shells umschreiben.
Davon abgesehen möchten Sie vielleicht auf Funktionen testen, nicht auf Distributionen. Ich benutze das nicht mehr, einfach weil es zu einer Wartungsbelastung wurde. Es ist einfacher, sich auf vertriebsübergreifende Tools und Lösungen zu verlassen.
Konzeptionell funktioniert es in der Reihenfolge:
- Ziehen Sie einen bekannten Dateityp "allgemeine Init-Skript-Funktion" ein. Diese sind verteilungsspezifisch. Wenn es nicht vorhanden ist, fahren Sie mit der nächsten Verteilungsprüfung fort.
- Überprüfen Sie die Existenz einer bestimmten, bekanntermaßen existierenden, häufig verwendeten und wahrscheinlich nicht umbenannten Funktion aus diesem Kernskript. Wir machen das mit dem
type
Bash eingebaut.type -t
gibtfunction
zurück wenn dieses Symbol eine Funktion ist. Wir stellenzz
voran zur Ausgabe vontype -t 2>/dev/null
denn wenn der Name nicht definiert wäre, wäre der Ausgabestring leer und wir würden einen Syntaxfehler über eine fehlende linke Hand zum==
erhalten Operator. Wenn der gerade überprüfte Name keine Funktion ist, fahren Sie mit der nächsten Verteilungsprüfung fort, andernfalls haben wir den Verteilungstyp gefunden.- Schließlich geben Sie den Verteilungstyp wieder, damit die Funktionsausgabe einfach in einem case .. esac-Block verwendet werden kann.
Bearbeiten Sie, falls Sie versuchen, dies als reines Skript auszuführen:Dieses Skript soll von anderen Skripten bezogen oder eingefügt werden. Es gibt nichts von sich aus aus, wenn Sie es so ausführen, wie es ist. Um es zu testen, sourcen Sie es und rufen Sie dann die Funktion auf, z. B.:
source /path/to/this/script.sh
get_distribution_type
an der Bash-Eingabeaufforderung.
Bearbeiten:Bitte beachten Sie, dass dieses Skript keine Root-Rechte erfordert. Ich fordere Sie auf, es nicht als root auszuführen. Sollte nichts schaden, ist aber auch nicht nötig.
Einen Link zu einem relevanten Mailinglisten-Beitrag im CVS-Protokoll gefunden. Sollte beim Entpacken von Init-Skript-Spaghetti hilfreich sein.
Lösung 2:
Versuchen Sie nicht, basierend auf der Distribution Annahmen darüber zu treffen, was Sie tun können und was nicht, denn auf diesem Weg liegt Wahnsinn (siehe auch "Erkennung von Benutzeragenten"). Ermitteln Sie stattdessen, ob das, was Sie tun möchten, unterstützt wird und wie es von dem Befehl oder Dateispeicherort ausgeführt wird, den Sie verwenden möchten.
Wenn Sie beispielsweise ein Paket installieren möchten, können Sie feststellen, ob Sie sich auf einem Debian-ähnlichen System oder einem RedHat-ähnlichen System befinden, indem Sie prüfen, ob dpkg oder rpm vorhanden sind (überprüfen Sie zuerst, ob dpkg vorhanden ist, da Debian-Rechner möglicherweise der rpm-Befehl auf ihnen ...). Treffen Sie Ihre Entscheidung darüber, was zu tun ist, nicht nur darauf, ob es sich um ein Debian- oder ein RedHat-System handelt. Auf diese Weise unterstützen Sie automatisch alle abgeleiteten Distributionen, die Sie nicht explizit programmiert haben. Oh, und wenn Ihr Paket bestimmte Abhängigkeiten erfordert, dann testen Sie diese auch und lassen Sie den Benutzer wissen, was ihnen fehlt.
Ein weiteres Beispiel ist das Hantieren mit Netzwerkschnittstellen. Finden Sie heraus, was zu tun ist, je nachdem, ob es eine /etc/network/interfaces-Datei oder ein /etc/sysconfig/network-scripts-Verzeichnis gibt, und beginnen Sie von dort aus.
Ja, es ist mehr Arbeit, aber wenn Sie nicht alle Fehler wiederholen möchten, die Webentwickler in den letzten zehn oder mehr Jahren gemacht haben, tun Sie es von Anfang an auf die intelligente Art und Weise.
Lösung 3:
Sie können die Kernel-Version finden, indem Sie uname -a
ausführen , das Finden der Distributionsversion hängt von der Distribution ab.
Unter Ubuntu und einigen anderen Betriebssystemen können Sie lsb_release -a
ausführen oder lesen Sie /etc/lsb_release
Debian speichert die Version in /etc/debian_version
Lösung 4:
Die meisten Distributionen haben eine einzigartige Methode zur Bestimmung der jeweiligen Distribution.
Zum Beispiel:
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
Es gibt einen Standard, der als Linux Standard Base oder LSB bekannt ist. Er definiert, dass es eine Datei namens /etc/lsb-release oder ein Programm namens lsb_release geben sollte, das Informationen über Ihre Linux-Distribution zurückgibt.
lsb_release -a
Lösung 5:
python -c 'import platform ; print platform.dist()[0]'
code:http://hg.python.org/cpython/file/2.7/Lib/platform.py