Как написать скрипт, который эффективно определяет имя дистрибутива?

13

Я видел этот пост о различных способах узнать, какой дистрибутив установлен, поэтому я пытаюсь написать скрипт, который пробует их все. Возможные команды включают в себя:

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

Я попытался написать что-то вроде этого (я говорю по-испански, так что по-испански):

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

Может ли кто-нибудь помочь мне включить все остальные способы получения имени дистрибутива?

inukaze
источник

Ответы:

13

Каждый дистрибутив (несмотря на усилия lsb) использует или может использовать (или даже может не иметь его) свой файл в / etc / для объявления своего имени и версии.

Вы должны добавить условие в свой скрипт для каждого из них. Также примите во внимание, что некоторые дистрибутивы являются производными от других основных и могут или не могут адаптировать свои файлы версий.

Если вы не хотите изобретать велосипед, вы можете использовать работу других людей для достижения того, что вы ищете. Например, в python на платформе модуля есть способ угадать распределение:

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.

например:

In [1]: import platform

In [2]: platform.linux_distribution()
Out[2]: ('Ubuntu', '11.10', 'oneiric')
hmontoliu
источник
3

Standard Base Linux определяет команду для этого:

lsb_release -si

Это не всегда является частью установки по умолчанию, поэтому, если вы хотите, чтобы ваш скрипт работал в каждой системе, вам придется вернуться к маршруту «посмотри и угадай».

Жиль "ТАК - перестань быть злым"
источник
lsb_release -si работает с некоторыми дистрибутивами, но не со всеми linux, под «ArchLinux, Slackware & Derivates» это не работает, результат «пустой»
inukaze
1

Это немного "грубая сила" метод выполнения вещей, но он быстрый и должен, используя bash, работать на большинстве дистрибутивов

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
источник
1

Если вы не боитесь дополнительных зависимостей, вы можете использовать facter для этого. Он дает информацию об имени и версии дистрибутива даже без установленного lsb_release.

RVS
источник