Come scrivere uno script che determina efficacemente il nome della distro?


13

Ho visto questo post su tutti i diversi modi per scoprire quale distribuzione è installata, quindi sto provando a scrivere uno script che li provi tutti. I possibili comandi includono:

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

Ho provato a scrivere qualcosa del genere (parlo spagnolo normalmente, quindi è in spagnolo):

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"
}

Qualcuno può aiutarmi a incorporare tutti gli altri modi per ottenere il nome di una distro?

Risposte:


13

Ogni distribuzione (nonostante gli sforzi di lsb) usa o può usare (o può anche mancare di esso) un file diverso in / etc / per dichiarare qual è il suo nome e versione.

È possibile aggiungere una condizione nel proprio script per ognuno. Tieni anche conto del fatto che alcune distro derivano da altre principali e possono o meno adattare i loro file di versione.

Se non vuoi reinventare la ruota, puoi usare il lavoro di altre persone per ottenere ciò che stai cercando. Ad esempio in Python nella piattaforma del modulo esiste un metodo per indovinare la distribuzione:

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.

per esempio:

In [1]: import platform

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

3

La base standard Linux specifica un comando per questo:

lsb_release -si

Non fa sempre parte dell'installazione predefinita, quindi se si desidera che lo script funzioni su tutti i sistemi, è necessario ricorrere alla route look-and-indovina.


lsb_release -si funziona con alcune distro, ma non con tutto Linux, in "ArchLinux, Slackware & Derivates" questo non funziona, il risultato è "vuoto"
inukaze

1

Questo è un po 'un metodo "a forza bruta" per realizzare le cose, ma è veloce e dovrebbe, usando bash, funzionare sulla maggior parte delle distro

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

Se non hai paura di dipendenze aggiuntive, puoi usare facter per quello. Fornisce informazioni sul nome e sulla versione della distribuzione anche senza lsb_release installato.

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.