Wie schreibe ich ein Skript, das den Namen der Distribution effektiv ermittelt?


13

Ich habe diesen Beitrag auf all den verschiedenen Wegen gesehen, um herauszufinden, welche Distribution installiert ist. Deshalb versuche ich, ein Skript zu schreiben, das sie alle ausprobiert. Die möglichen Befehle umfassen:

$ cat /etc/lsb-release 
$ cat /etc/issue 
$ dmesg | head -1
$ cat /proc/version 
$ cat /etc/slackware-version 
$ cat/etc/debian-verion 

Ich habe versucht, so etwas zu schreiben (ich spreche normalerweise Spanisch, es ist also auf Spanisch):

function Nombre_SO()
{

    DistroName="Linux"
    if [ $DistroName = Linux ] ;
    then

# Debian
    debian=`cat /etc/debian_version | cut -d " " -f01 | tr '[:upper:]' '[:lower:]'`
    if [ "$debian" = "debian" || "squeeze/sid" || "lenny" ]; 
        then
        DistroName="debian"
        else
        echo "Esto no es debian"
    fi

# Slackware
    slackware=`cat /etc/slackware-version | cut -d " " -f01` | tr '[:upper:]' '[:lower:]'`
    if [ "$slackware" = "slackware" || "slackware-x86_64" ];
    then
        DistroName="slackware" 
    else
    echo "Esto no es Slackware"
}

Kann mir jemand helfen, alle anderen Möglichkeiten zu finden, um den Namen einer Distribution zu ermitteln?

Antworten:


13

Jede Distribution verwendet (trotz der Bemühungen von lsb) möglicherweise eine andere Datei in / etc /, um ihren Namen und ihre Version zu deklarieren.

Sie müssen in Ihrem Skript für jede Bedingung eine Bedingung hinzufügen. Berücksichtigen Sie auch, dass einige Distributionen von anderen Hauptdistributionen abgeleitet sind und ihre Versionsdateien möglicherweise anpassen oder nicht.

Wenn Sie das Rad nicht neu erfinden möchten, können Sie die Arbeit anderer nutzen, um das zu erreichen, wonach Sie suchen. Zum Beispiel in Python in der Modulplattform ist es ein Verfahren , um die Verteilung zu erraten:

Help on function linux_distribution in module platform:

linux_distribution(distname='', version='', id='', supported_dists=('SuSE', 'debian', 'fedora', 'redhat', 'centos', 'mandrake', 'mandriva', 'rocks', 'slackware', 'yellowdog', 'gentoo', 'UnitedLinux', 'turbolinux'), full_distribution_name=1)
    Tries to determine the name of the Linux OS distribution name.

    The function first looks for a distribution release file in
    /etc and then reverts to _dist_try_harder() in case no
    suitable files are found.

    supported_dists may be given to define the set of Linux
    distributions to look for. It defaults to a list of currently
    supported Linux distributions identified by their release file
    name.

    If full_distribution_name is true (default), the full
    distribution read from the OS is returned. Otherwise the short
    name taken from supported_dists is used.

    Returns a tuple (distname,version,id) which default to the
    args given as parameters.

beispielsweise:

In [1]: import platform

In [2]: platform.linux_distribution()
Out[2]: ('Ubuntu', '11.10', 'oneiric')

3

Die Linux Standard Base gibt dafür einen Befehl an:

lsb_release -si

Dies ist nicht immer Teil der Standardinstallation. Wenn Sie also möchten, dass Ihr Skript auf jedem System funktioniert, müssen Sie auf die Look-and-Guess-Methode zurückgreifen.


lsb_release -si funktioniert mit einigen Distributionen, aber nicht mit allen Linux-Versionen. Unter "ArchLinux, Slackware & Derivates" funktioniert dies nicht, das Ergebnis ist "leer"
inukaze

1

Dies ist eine Art "Brute-Force" -Methode, um Dinge zu erledigen, aber sie ist schnell und sollte mit bash bei den meisten Distributionen funktionieren

ver=$(cat /etc/*{issues,release,version} 2> /dev/null)
if [[ $(echo $ver | grep DISTRIB_ID) ]]; then
    lsb_release -si
else
    echo $ver | cut -d ' ' -f 1 | sort -u | head -1
fi

1

Wenn Sie keine Angst vor zusätzlichen Abhängigkeiten haben, können Sie dafür facter verwenden . Es gibt Informationen über den Namen und die Version der Distribution, auch wenn lsb_release nicht installiert ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.