Como escrever um script que determine efetivamente o nome da distribuição?

13

Eu vi este post de todas as maneiras diferentes para descobrir qual distro está instalada, então estou tentando escrever um script que tente todas elas. Os comandos possíveis incluem:

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

Eu tentei escrever algo assim (falo espanhol normalmente, por isso é em espanhol):

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

Alguém pode me ajudar a incorporar todas as outras formas de obter o nome de uma distro?

    
por inukaze 21.10.2011 / 21:23

4 respostas

13

Cada distribuição (apesar dos esforços de lsb) usa ou pode usar (ou mesmo pode faltar) um arquivo diferente em / etc / para declarar qual é seu nome e versão.

Você deve adicionar uma condição ao seu script para cada um. Também leve em consideração que algumas distros são derivadas de outras importantes e podem ou não adaptar seus arquivos de versão.

Se você não quiser reinventar a roda, você pode usar outras pessoas para alcançar o que você está procurando. Por exemplo, em python, no módulo plataforma , existe um método para adivinhar a distribuição:

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 exemplo:

In [1]: import platform

In [2]: platform.linux_distribution()
Out[2]: ('Ubuntu', '11.10', 'oneiric')
    
por 21.10.2011 / 21:51
3

A Base Padrão do Linux especifica um comando para isso:

lsb_release -si

Nem sempre faz parte da instalação padrão, por isso, se você quiser que o seu script funcione em todos os sistemas, você terá que voltar à rota do look-and-guess.

    
por 22.10.2011 / 04:19
1

Este é um método de "força bruta" para realizar as coisas, mas é rápido e deve, usando o bash, funcionar na maioria das distros

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
    
por 22.10.2011 / 18:33
1

Se você não tem medo de dependências adicionais, pode usar facter para isso. Ele fornece informações sobre o nome e a versão da distribuição, mesmo sem o lsb_release instalado.

    
por 22.10.2011 / 19:26

Tags