Comment écrire un script qui détermine efficacement le nom de la distribution?

13

J'ai vu ce post sur toutes les différentes façons de savoir quelle distribution est installée, donc j'essaie d'écrire un script qui les essaie tous. Les commandes possibles incluent:

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

J'ai essayé d'écrire quelque chose comme ça (je parle normalement espagnol, donc c'est en espagnol):

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

Quelqu'un peut-il m'aider à intégrer toutes les autres façons d'obtenir le nom d'une distribution?

inukaze
la source

Réponses:

13

Chaque distribution (malgré les efforts de lsb) utilise ou peut utiliser (ou même en manquer) un fichier différent dans / etc / pour déclarer quel est son nom et sa version.

Vous devez ajouter une condition dans votre script pour chacune. Tenez également compte du fait que certaines distributions sont dérivées d'autres principales et peuvent ou non adapter leurs fichiers de version.

Si vous ne voulez pas réinventer la roue, vous pouvez faire appel à d'autres personnes pour réaliser ce que vous recherchez. Par exemple en python dans la plateforme du module il y a une méthode pour deviner la distribution:

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.

par exemple:

In [1]: import platform

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

La Linux Standard Base spécifie une commande pour que:

lsb_release -si

Cela ne fait pas toujours partie de l'installation par défaut, donc si vous voulez que votre script fonctionne sur tous les systèmes, vous devrez vous rabattre sur la route du look-and-guess.

Gilles 'SO- arrête d'être méchant'
la source
lsb_release -si fonctionne avec quelques distributions, mais pas avec tout Linux, sous "ArchLinux, Slackware & Derivates" cela ne fonctionne pas, le résultat est "vierge"
inukaze
1

C'est un peu une méthode "brute-force" pour accomplir des choses, mais c'est rapide et devrait, en utilisant bash, fonctionner sur la plupart des distributions

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
la source
1

Si vous n'avez pas peur des dépendances supplémentaires, vous pouvez utiliser Facter pour cela. Il donne des informations sur le nom et la version de la distribution même sans lsb_release installé.

rvs
la source