Como descubro qual versão do Linux está sendo executada?

29

Às vezes, seus scripts precisam se comportar de maneira diferente em diferentes Linuxs. Como posso determinar em qual versão do Linux um script está sendo executado?

    
por jldugger 03.05.2009 / 01:11

14 respostas

27

Não tente fazer suposições baseadas na distro sobre o que você pode e não pode fazer, pois assim fica a loucura (veja também "Detecção do agente do usuário"). Em vez disso, detecte se o que você deseja fazer é suportado e como é feito por qualquer comando ou local de arquivo que você queira usar.

Por exemplo, se você quiser instalar um pacote, você pode detectar se você está em um sistema parecido com o Debian ou um sistema semelhante a RedHat verificando a existência de dpkg ou rpm (verifique primeiro o dpkg, porque o Debian máquinas podem ter o comando rpm nelas ...). Faça sua decisão sobre o que fazer com base nisso, não apenas sobre se é um sistema Debian ou RedHat. Dessa forma, você suportará automaticamente quaisquer distribuições derivadas que não foram programadas explicitamente. Ah, e se o seu pacote exigir dependências específicas, teste-as também e informe ao usuário o que está faltando.

Outro exemplo é mexer nas interfaces de rede. Pesquise o que fazer com base em um arquivo / etc / network / interfaces ou em um diretório / etc / sysconfig / network-scripts e a partir daí.

Sim, é mais trabalho, mas, a menos que você queira refazer todos os erros que os desenvolvedores da Web cometeram na última década ou mais, você fará isso de maneira inteligente desde o início.

    
por 03.05.2009 / 02:06
36

Não há forma de distribuição cruzada. No entanto:

  • Redhat and friends: Test for /etc/redhat-release, check contents
  • Debian: Test for /etc/debian_version, check contents
  • Mandriva and friends: Test for /etc/version, check contents
  • Slackware: Test for /etc/slackware-version, check contents

Etc. De um modo geral, verifique /etc/*-release e /etc/*-version .

Edit: Encontrei um velho (1 + anos) script meu mentindo em torno de que eu devo ter remendado juntos ao longo dos anos (tem um impressionante log CVS voltando 6 anos.) Pode não funcionar mais corretamente como é e não posso ser incomodado em encontrar distros instaladas para testar, mas deve fornecer um bom ponto de partida. Funciona bem no CentOS, Fedora e Gentoo. gyaresu testou com sucesso no Debian Lenny.

#!/bin/bash

get_distribution_type()
{
    local dtype
    # Assume unknown
    dtype="unknown"

    # First test against Fedora / RHEL / CentOS / generic Redhat derivative
    if [ -r /etc/rc.d/init.d/functions ]; then
        source /etc/rc.d/init.d/functions
        [ zz'type -t passed 2>/dev/null' == "zzfunction" ] && dtype="redhat"

    # Then test against SUSE (must be after Redhat,
    # I've seen rc.status on Ubuntu I think? TODO: Recheck that)
    elif [ -r /etc/rc.status ]; then
        source /etc/rc.status
        [ zz'type -t rc_reset 2>/dev/null' == "zzfunction" ] && dtype="suse"

    # Then test against Debian, Ubuntu and friends
    elif [ -r /lib/lsb/init-functions ]; then
        source /lib/lsb/init-functions
        [ zz'type -t log_begin_msg 2>/dev/null' == "zzfunction" ] && dtype="debian"

    # Then test against Gentoo
    elif [ -r /etc/init.d/functions.sh ]; then
        source /etc/init.d/functions.sh
        [ zz'type -t ebegin 2>/dev/null' == "zzfunction" ] && dtype="gentoo"

    # For Slackware we currently just test if /etc/slackware-version exists
    # and isn't empty (TODO: Find a better way :)
    elif [ -s /etc/slackware-version ]; then
        dtype="slackware"
    fi
    echo $dtype
}

Observe que isso provavelmente funcionará apenas corretamente no Bash. Você poderia reescrevê-lo de outras conchas.

Dito isso, você pode querer testar recursos, não distribuições. Eu não estou mais usando isso simplesmente porque se tornou um fardo de manutenção. É mais fácil confiar em ferramentas e soluções de distribuição cruzada.

Conceitualmente, o que acontece é:

  • Pull in a known, "common init script function" type of file. Those are distribution-specific. If it doesn't exist, skip to next distribution check.
  • Check the existence of a specific, known-to-exist, often-used and unlikely to be renamed function from that core script. We do that using the type Bash builtin. type -t returns function if that symbol is a function. We prepend zz to the output from type -t 2>/dev/null because if the name isn't defined the output string would be empty and we'd get a syntax error about a missing left hand to the == operator. If the name we just checked isn't a function, skip to next distribution check, otherwise we found the distribution type.
  • Finally, echo the distribution type so the function output can be easily used in a case .. esac block.

Edite caso você esteja tentando executar isso como um script direto: esse script deve ser originado ou incluído em outros scripts. Ele não produz nada por si próprio se você o executar como está. Para testá-lo, crie-o e invoque a função, por exemplo:

source /path/to/this/script.sh
get_distribution_type

no prompt bash.

Edit: Por favor, note que este script não requer privilégios de root. Eu recomendo que você não o execute como root. Não deve prejudicar nada, mas não há necessidade.

Encontrou um link para um post da lista de discussão relevante no Log do CVS. Deve ser útil ao desembrulhar o espaguete do script de inicialização.

    
por 03.05.2009 / 01:15
17

Você pode encontrar a versão do kernel rodando uname -a , achando que a versão da distro depende da distro.

No Ubuntu e em algum outro sistema operacional, você pode executar lsb_release -a ou ler / etc / lsb_release

O Debian armazena a versão em / etc / debian_version

    
por 03.05.2009 / 01:14
6

A maioria das distro tem um método único de determinar a distribuição particular.

Por exemplo:

Redhat (And derivatives): /etc/redhat-release

SUSE: /etc/SUSE-release

Existe um padrão conhecido como Base Padrão do Linux ou LSB . Ele define que deve haver um arquivo chamado / etc / lsb-release ou um programa chamado lsb_release que retornará informações sobre sua distribuição linux.

lsb_release -a
    
por 03.05.2009 / 01:24
6
python -c 'import platform ; print platform.dist()[0]'

código: link

    
por 19.09.2012 / 04:14
5

Além das outras respostas: Se você quiser apenas analisar um arquivo, a maioria das distros personalizará o login do tty via / etc / issue, por exemplo:

Welcome to SUSE Linux Enterprise Server 10 SP2 (i586) - Kernel \r (\l).

E sim, eu sei que é suboptimal. :)

    
por 03.05.2009 / 01:21
4
O

facter é uma ferramenta útil para esse tipo de descoberta, embora provavelmente use alguns dos métodos detalhados acima e exija Ruby.

    
por 05.05.2009 / 02:52
2

Tudo o que você precisa fazer é digitar uname -a em seu shell favorito. Isso imprimirá o nome e a versão do kernel.

    
por 05.05.2009 / 03:41
2

Descobri que cat /etc/*release* quase sempre funciona.

    
por 25.10.2009 / 07:42
2
Concordo com Mark, Adam e Mihai (não posso votar devido à reputação insuficiente). As soluções baseadas no LSB e sua relativa FHS funcionarão com a maioria das distribuições e provavelmente continuarão funcionando no futuro. LSB e FHS são seus amigos.

    
por 10.11.2009 / 04:11
2

Você também pode obter a versão por

cat /proc/version

o / p:

Linux version 2.6.17-13mdv ([email protected]) (gcc version 4.1.2 20070302 (prerelease) (4.1.2-1mdv2007.1)) #1 SMP Fri Mar 23 19:03:31 UTC 2007

    
por 10.06.2009 / 11:12
1

A versão do linux é uma questão difícil. Se olharmos de perto, temos a versão do kernel que você pode obter com " uname -r ". A versão de distribuição é principalmente irrelevante. Algumas distribuições são melhores (distribuições corporativas como Redhat Enterprise Linux). Outras distribuições como o Gentoo são basicamente alvos em movimento que não têm nenhuma versão sensível. Se você precisa fazer coisas com base na versão, dê uma olhada nos principais componentes que são relevantes para você:

Component       Version command
glibc           /lib/libc.so.6
gcc             gcc --version
X               xdpyinfo
libX11          pkg-config --modversion x11
gtk+            pkg-config --modversion gtk+-2.0
qt-4            pkg-config --modversion QtCore

   etc...
    
por 03.05.2009 / 19:46
1

Você também pode verificar o menu do Grub, geralmente lhe dá um monte de informações de distro / versão: -)

    
por 10.06.2009 / 11:55
-1

FusionInventory é uma ferramenta de inventário leve de várias plataformas que pode obter essas informações em muitas distribuições do Linux, mas também em BSDs, Windows, MacOS X e outros unices.

Se disponível, eles usam lsb_release (como mencionado algumas vezes acima), mas se não tiverem uma lista muito útil de arquivos e expressões regulares para verificar o nome e a versão da distribuição: link .

Eu recomendaria usar o próprio FusionInventory para obter essas informações, em vez de reimplementar seus próprios scripts com essa lógica, pois a comunidade deles manterá essa funcionalidade atualizada. Você pode usar o agente sozinho (ele gera um arquivo XML / JSON que é fácil de analisar) ou combiná-lo com uma solução mais ampla para gerenciar as máquinas em sua rede, como GLPI ou Leme , dependendo das suas necessidades.

    
por 21.09.2012 / 09:04