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

13

Eu vi esse post sobre todas as maneiras diferentes de 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 

Tentei escrever algo assim (falo espanhol normalmente, então é 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 maneiras de obter o nome de uma distribuição?

inukaze
fonte

Respostas:

13

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

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

Se você não quiser reinventar a roda, poderá usar outras pessoas para alcançar o que está procurando. Por exemplo, em python na plataforma do módulo , 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')
hmontoliu
fonte
3

O Linux Standard Base especifica um comando para isso:

lsb_release -si

Nem sempre faz parte da instalação padrão; portanto, se você quiser que seu script funcione em todos os sistemas, precisará voltar ao caminho da aparência e do palpite.

Gilles 'SO- parar de ser mau'
fonte
lsb_release -Si trabalha com algumas distros, mas não com todos linux, em "ArchLinux, Slackware & Derivados" este trabalho não faça, o resultado é "em branco"
inukaze
1

Este é um método um pouco 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
frogstarr78
fonte
1

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

rvs
fonte