Como saber se a plataforma em execução é Ubuntu ou CentOS com a ajuda de um script Bash?

39

Conheço os comandos para verificar o nome da máquina Linux em execução na minha máquina. Por exemplo:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

Como obtenho a saída do terminal e a comparo para ver se é UBUNTU ou CENTOS e execute os seguintes comandos?

apt-get install updates 

ou

yum update

Ubuntu 14.04

cat /etc/issue
shekhar
fonte
2
Bem-vindo ao Ask Ubuntu. Por favor, você poderia dedicar parte do seu tempo para ler O que devo fazer quando alguém responder à minha pergunta?
Sylvain Pineau

Respostas:

53

Infelizmente, não há uma maneira infalível, simples de obter o nome da distribuição. A maioria das grandes distros está se movendo em direção a um sistema em que elas usam /etc/os-releasepara armazenar essas informações. A maioria das distribuições modernas também inclui as lsb_releaseferramentas, mas elas nem sempre são instaladas por padrão. Então, aqui estão algumas abordagens que você pode usar:

  1. Usar /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. Use as lsb_releaseferramentas, se disponíveis

    lsb_release -d | awk -F"\t" '{print $2}'
  3. Use um script mais complexo que funcione para a grande maioria das distribuições:

    # Determine OS platform
    UNAME=$(uname | tr "[:upper:]" "[:lower:]")
    # If Linux, try to determine specific distribution
    if [ "$UNAME" == "linux" ]; then
        # If available, use LSB to identify distribution
        if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
            export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
        # Otherwise, use release info file
        else
            export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
        fi
    fi
    # For everything else (or if above failed), just use generic identifier
    [ "$DISTRO" == "" ] && export DISTRO=$UNAME
    unset UNAME
  4. Analise as informações da versão gccse estiver instalado:

    CentOS 5.x

    $ gcc --version
    gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
    Copyright (C) 2006 Free Software Foundation, Inc.

    CentOS 6.x

    $ gcc --version
    gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
    Copyright (C) 2010 Free Software Foundation, Inc.

    Ubuntu 12.04

    $ gcc --version
    gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
    Copyright (C) 2011 Free Software Foundation, Inc.

    Ubuntu 14.04

    $ gcc --version
    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
    Copyright (C) 2013 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Basicamente, isso foi copiado diretamente da ótima resposta do @ slm para minha pergunta aqui .

terdon
fonte
"Infelizmente, não há uma maneira infalível e simples de obter o nome da distribuição." <— Este não é o caso. Sylvain Pineau , por exemplo, exibiu um one-liner trivial consultando com segurança o tipo de plataforma atual, adiando para o Python - que vem pré-instalado na maioria das plataformas (incluindo o Ubuntu). Os scripts de shell nunca devem tentar consultar manualmente os metadados da plataforma com testes de nível inferior e não portáteis, do tipo implementado nesta resposta.
perfil completo de Cecil Curry
O Gawk não está instalado no Debian por padrão.
Ville Laitila
@VilleLaitila Acho que isso não é relevante aqui, já que este site é apenas sobre o Ubuntu. Mas não há nada de específico aqui, então awkou mawkqualquer outra implementação também funcionaria.
terdon
Ainda mais específico usando lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode 4/11
@NerdOfCode, se você quiser apenas o número da versão, faça lsb_release -d | awk '{print $3}'ou grep -oP 'VERSION="\K\S+' /etc/os-releasenão precisará do tubo duplo para ativar.
terdon
25

Você não precisa do bash para executar essa tarefa, e eu sugiro usar uma abordagem de alto nível para evitar lidar com arquivos como /etc/versione /etc/issue(eu não tenho o / etc / version na 13.10).

Portanto, minha recomendação é usar este comando:

python -mplatform | grep -qi Ubuntu && sudo apt-get update || sudo yum update

python plataforma módulo irá funcionar em ambos os sistemas, o resto do comando verificará se o Ubuntu é devolvido pelo python e executar apt-getoutra yum.

Sylvain Pineau
fonte
adicionar -ia greppode ajudar.
coanor
8

Aqui está uma resposta simples que eu acho que funciona em todas as versões do Ubuntu / CentOS / RHEL pela mera presença dos arquivos (não é à prova de falhas, é claro, se alguém soltar aleatoriamente / etc / redhat-release em suas caixas do Ubuntu, etc):

if [ -f /etc/redhat-release ]; then
  yum update
fi

if [ -f /etc/lsb-release ]; then
  apt-get update
fi
Adão
fonte
no meu ubuntu não há / etc / lsb-release
noonex 14/11/16
3
Não vou -1, mas esta resposta não está correta em pelo menos um caso: /etc/lsb-releaseexiste no CloudLinux (CentOS) 6.8, portanto retornará ambos yume apt-get.
dhaupin
5

Use o Chef para essas tarefas. ;-)

No Chef, você pode usar o platform?método:

if platform?("redhat", "centos", "fedora")
  # Code for only Red Hat Linux family systems.
end

Ou:

if platform?("ubuntu")
  # Code for only Ubuntu systems
end

Ou:

if platform?("ubuntu")
  # Do Ubuntu things
end

Ou:

if platform?("freebsd", "openbsd")
  # Do BSD things
end
user1323
fonte
1
Enquanto comprovadamente superior aos não-soluções frágeis shell-centric de baixo nível (por exemplo, lsb_release, /etc/os-release), esta solução tem a desvantagem de exigir Chef - uma infra-estrutura de pesos pesados como Código (IAC) quadro não instalado por padrão na maioria das plataformas e exigindo o uso de sua própria linguagem específica de domínio (DSL). Em suma, a maioria dos usuários provavelmente apenas deseja adiar para o Python , que é instalado por padrão na maioria das plataformas (incluindo o Ubuntu) e faz uma boa interface com os scripts de shell.
perfil completo de Cecil Curry
5

Verifique o Ubuntu no nome do kernel:

if [  -n "$(uname -a | grep Ubuntu)" ]; then
    sudo apt-get update && sudo apt-get upgrade 
else
    yum update
fi  
Harris
fonte
4
 apt-get -v &> /dev/null && apt-get update
 which yum &> /dev/null && yum update

se houver apenas duas distribuições, você poderá reduzi-las:

apt-get -v &> /dev/null && apt-get update || yum update

de alguma forma, yum -vretorne diferente de zero no CentOS; portanto, use-o which; é
claro que você deve considerar o cenário se não houver nenhum whichinstalado.

Chang Land
fonte
2

O script a seguir deve dizer se é o Ubuntu. Caso contrário, e a única outra opção que você tem é o CentOS, você deve incluí-la em uma elsecláusula:

dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi
jobin
fonte
1
Provavelmente, isso pode ser simplificado usando a lsb_releaseferramenta, que deve ler os mesmos arquivos. lsb_release -irelatórios Distributor ID: Ubuntuou Distributor ID: CentOSnesses casos.
cronite
@chronitis: sim, com certeza pode ser
jobin
Eu não acho que ele está disponível por padrão no Centos embora
Sylvain Pineau
1

Execute /etc/os-releaseem um sub shell e ecoe seu valor:

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi
jobwat
fonte
0

Eu usaria python

if ! python -c "exec(\"import platform\nexit ('centos' not in platform.linux_distribution()[0].lower())\")" ; then
   echo "It is not CentOS distribution, ignoring CentOS setup"
   exit 0
fi
Can Tecim
fonte
0

O uso deste comando funciona no CentOS, Ubuntu e Debian: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

No Debian ele produz Debian GNU/Linux, no Ubuntu ele produz Ubuntue no CentOS ele produz CentOS Linux.

A vantagem de usar grep, cut e sed em vez de gawk é clara: o Debian não possui o gawk instalado por padrão, portanto você não pode confiar nele na caixa Debian aleatória.

Ville Laitila
fonte