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

28

Eu 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 faço para obter a saída do terminal e comparar para ver se é UBUNTU ou CENTOS e executar os seguintes comandos?

apt-get install updates 

ou

yum update

Ubunutu 14.04

cat /etc/issue
    
por shekhar 02.05.2014 / 11:15

10 respostas

31

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

  1. Use /etc/os-release

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

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

    # 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 de gcc se 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.
    

Isso foi basicamente copiado diretamente da resposta do @ slm para minha pergunta aqui .

    
por terdon 02.05.2014 / 12:18
25

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

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

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

O módulo plataforma do python funcionará em ambos os sistemas, o resto do comando irá verificar se o Ubuntu está retornado por python e execute apt-get else yum .

    
por Sylvain Pineau 02.05.2014 / 11:27
5

Use o Chef para essas tarefas. -)

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

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
    
por user1323 02.05.2014 / 11:33
5

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 (sem falhar se alguém estiver lançando o / etc / redhat-release aleatoriamente nas caixas do Ubuntu, etc) :

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

if [ -f /etc/lsb-release ]; then
  apt-get update
fi
    
por Adam 22.07.2015 / 00:49
4
 apt-get -v &> /dev/null && apt-get update
 which yum &> /dev/null && yum update

se houver apenas duas distro, você poderá diminuir:

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

de alguma forma, yum -v retornam diferente de zero no CentOS, então use which , em vez disso,
é claro que você deve considerar o cenário se não houver which instalado.

    
por Chang Land 23.02.2016 / 15:37
2

O seguinte script deve dizer se é o Ubuntu. Se não for e a única outra opção que você tem é o CentOS, você deve tê-lo em uma cláusula else :

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

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi
    
por jobin 02.05.2014 / 11:28
2

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  
    
por Harris 07.02.2017 / 01:36
1

Execute /etc/os-release em um subcaminho e faça eco de seu valor:

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

Eu usaria o 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
    
por Can Tecim 07.03.2018 / 09:55
0

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

No Debian, ele rende Debian GNU/Linux , no Ubuntu ele rende Ubuntu e no CentOS ele rende CentOS Linux .

O benefício de usar o grep, o cut e o sed ao invés do gawk é claro: o Debian não tem o gawk instalado por padrão, então você não pode confiar nele em uma caixa aleatória do Debian.

    
por Ville Laitila 20.04.2018 / 10:02