it-swarm-es.com

¿Cómo saber si la plataforma en ejecución es Ubuntu o CentOS con la ayuda de un script Bash?

Conozco los comandos para verificar el nombre de la máquina Linux que se ejecuta en mi máquina. Por ejemplo:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

¿Cómo obtengo el resultado del terminal y lo comparo para ver si es UBUNTU o CENTOS y realizo los siguientes comandos?

apt-get install updates 

o

yum update

Ubunutu 14.04

cat /etc/issue
38
shekhar

Desafortunadamente, no hay una forma segura y sencilla de obtener el nombre de la distribución. La mayoría de las distribuciones principales se están moviendo hacia un sistema donde usan /etc/os-release para almacenar esta información. La mayoría de las distribuciones modernas también incluyen las herramientas lsb_release pero estas no siempre se instalan por defecto. Entonces, aquí hay algunos enfoques que puede usar:

  1. Use /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
    
  2. Use las herramientas lsb_release si están disponibles

    lsb_release -d | awk -F"\t" '{print $2}'
    
  3. Utilice un script más complejo que debería funcionar para la gran mayoría de las distribuciones:

    # 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. Analice la información de versión de gcc si está instalada:

    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.
    

Básicamente, esto se ha copiado directamente de @ slm's great respuesta a mi pregunta aquí .

51
terdon

No necesita bash para realizar dicha tarea, y le sugiero que utilice un enfoque de alto nivel para evitar tratar con archivos como /etc/version y /etc/issue (No tengo/etc/version en 13.10).

Entonces mi recomendación es usar este comando en su lugar:

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

python plataforma el módulo funcionará en ambos sistemas, el resto del comando verificará si Ubuntu es devuelto por python y ejecutará apt-get else yum.

25
Sylvain Pineau

Aquí hay una respuesta simple que creo que funciona en todas las versiones de Ubuntu/CentOS/RHEL por la mera presencia de los archivos (no es seguro, por supuesto, si alguien está soltando aleatoriamente/etc/redhat-release en sus cajas de Ubuntu, etc.):

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

if [ -f /etc/lsb-release ]; then
  apt-get update
fi
8
Adam

Use Chef para estas tareas. ;-)

En Chef, puede usar el método platform? :

_if platform?("redhat", "centos", "Fedora")
  # Code for only Red Hat Linux family systems.
end
_

O:

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

O:

_if platform?("ubuntu")
  # Do Ubuntu things
end
_

O:

_if platform?("freebsd", "openbsd")
  # Do BSD things
end
_
5
user1323

Verifique Ubuntu en el nombre del kernel:

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

si solo hay dos distro, entonces puedes acortarlo:

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

de alguna manera yum -v devuelve un valor distinto de cero en CentOS, así que use which en su lugar,
por supuesto, debe considerar el escenario si no hay which instalado.

4
Chang Land

El siguiente script debería decir si es Ubuntu. Si no es así y la única otra opción que tiene es CentOS, debe tenerla en una cláusula else:

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

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi
2
jobin

Ejecute /etc/os-release en un Shell secundario y haga eco de su valor:

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

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

En Debian produce Debian GNU/Linux, en Ubuntu produce Ubuntu y en CentOS produce CentOS Linux.

El beneficio de usar grep, cut y sed en lugar de gawk es claro: Debian no tiene gawk instalado por defecto, por lo que no puede confiar en él en un cuadro Debian aleatorio.

0
Ville Laitila

Usaría 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
0
Can Tecim