¿Cómo escribir un script que determine efectivamente el nombre de la distribución?

13

Vi esta publicación sobre todas las diferentes formas de averiguar qué distribución está instalada, así que estoy tratando de escribir un script que los pruebe a todos. Los posibles comandos incluyen:

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

Intenté escribir algo como esto (hablo español normalmente, así que está en español):

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

¿Alguien puede ayudarme a incorporar todas las otras formas de obtener el nombre de una distribución?

inukaze
fuente

Respuestas:

13

Cada distribución (a pesar de los esfuerzos de lsb) usa o puede usar (o incluso puede carecer) un archivo diferente en / etc / para declarar cuál es su nombre y versión.

Debe agregar una condición en su script para cada uno. También tenga en cuenta que algunas distribuciones se derivan de otras importantes y pueden o no adaptar sus archivos de versión.

Si no desea reinventar la rueda, puede utilizar el trabajo de otras personas para lograr lo que está buscando. Por ejemplo, en python en la plataforma del módulo hay un método para adivinar la distribución:

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.

por ejemplo:

In [1]: import platform

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

La base estándar de Linux especifica un comando para eso:

lsb_release -si

No siempre forma parte de la instalación predeterminada, por lo que si desea que su script funcione en todos los sistemas, tendrá que recurrir a la ruta de buscar y adivinar.

Gilles 'SO- deja de ser malvado'
fuente
lsb_release -si funciona con algunas distribuciones, pero no con todos los linux, en "ArchLinux, Slackware & Derivates" esto no funciona, el resultado es "en blanco"
inukaze
1

Este es un método un poco "de fuerza bruta" para lograr cosas, pero es rápido y debería, usando bash, trabajar en la mayoría de las distribuciones

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
frogstarr78
fuente
1

Si no tiene miedo a las dependencias adicionales, puede usar facter para eso. Proporciona información sobre el nombre y la versión de la distribución, incluso sin lsb_release instalado.

rvs
fuente