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


39

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

Ubuntu 14.04

cat /etc/issue

2
Bienvenido a Ask Ubuntu. Por favor, ¿podría dedicar parte de su tiempo a leer ? ¿Qué debo hacer cuando alguien responde mi pregunta?
Sylvain Pineau

Respuestas:


53

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

  1. Utilizar /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. Use las lsb_releaseherramientas 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 gccsi está 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.

Básicamente, esto se ha copiado directamente de la gran respuesta de @ slm a mi pregunta aquí .


"Desafortunadamente, no existe una forma segura y simple de obtener el nombre de la distribución". <— Este no es el caso en absoluto. Sylvain Pineau , por ejemplo, exhibió un trivial de una sola línea que consulta de manera confiable el tipo de plataforma actual al diferir a Python, que viene preinstalado en la mayoría de las plataformas (incluido Ubuntu). Los scripts de shell nunca deberían intentar consultar manualmente los metadatos de la plataforma con pruebas no portátiles de bajo nivel del tipo implementado en esta respuesta.
Cecil Curry

Gawk no está instalado en Debian por defecto.
Ville Laitila

@VilleLaitila Me temo que no es relevante aquí, ya que este sitio es solo sobre Ubuntu. Pero aquí no hay nada específico de gawk, por lo que awkcualquier mawkotra implementación funcionaría igual de bien.
terdon

Aún más específico usando lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode

@NerdOfCode si solo desea el número de versión, do lsb_release -d | awk '{print $3}'o grep -oP 'VERSION="\K\S+' /etc/os-release, no es necesario que la doble tubería se active.
terdon

25

No necesita bash para realizar dicha tarea, y le sugiero que utilice un enfoque de alto nivel para evitar tratar con archivos como /etc/versiony /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

El módulo de plataforma Python funcionará en ambos sistemas, el resto del comando verificará si Ubuntu es devuelto por Python y ejecutará apt-getotra cosa yum.


agregar -ia greppuede ayudar.
coanor

8

Aquí hay una respuesta simple que encuentro 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

en mi ubuntu no hay / etc / lsb-release
noonex

3
No voy a -1, pero esta respuesta no es correcta en al menos un caso: /etc/lsb-releaseexiste en CloudLinux (CentOS) 6.8, por lo que devolverá ambos yumy apt-get.
dhaupin

5

Use Chef para estas tareas. ;-)

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

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

1
Mientras que demostrablemente superior a la cáscara centrada frágiles no soluciones de bajo nivel (por ejemplo, lsb_release, /etc/os-release), esta solución tiene la desventaja de requerir Chef - una Infraestructura de peso pesado como Código (IAC) marco no instalado de forma predeterminada en la mayoría de plataformas y que requiere el uso de su propio lenguaje específico de dominio (DSL). En resumen, la mayoría de los usuarios probablemente solo desean diferir a Python , que está instalado de manera predeterminada en la mayoría de las plataformas (incluida Ubuntu) e interactúa bien con las secuencias de comandos de shell.
Cecil Curry

5

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  

4
 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 -vdevuelve un valor distinto de cero en CentOS, así que úselo en su whichlugar,
por supuesto, debe considerar el escenario si no hay whichinstalado.


2

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

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

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

1
Esto probablemente se puede simplificar usando la lsb_releaseherramienta, que debería leer los mismos archivos. lsb_release -iinformes ya sea Distributor ID: Ubuntuo Distributor ID: CentOSen estos casos.
cronitis

@chronitis: sí, seguro que puede ser
jobin

Sin embargo, no creo que esté disponible por defecto en Centos
Sylvain Pineau

1

Ejecutar /etc/os-releaseen un sub shell y hacer eco de su valor:

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

0

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

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 cede Debian GNU/Linux, en Ubuntu cede Ubuntuy en CentOS cede 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.