29 votos

¿Cómo puedo saber qué versión de Linux se está ejecutando?

A veces los scripts necesidad de comportarse de manera diferente en diferentes Linux. ¿Cómo puedo saber qué versión de Linux se está ejecutando un guión?

27voto

Ryan Sampson Puntos 2898

No trate de hacer suposiciones basadas en la distribución de lo que pueden y no pueden hacer, para que de esa manera se encuentra la locura (véase también "Agente de Usuario de detección"). En su lugar, detectar si lo que quieres hacer es compatible, y cómo se hace, cualquier comando o la ubicación del archivo que desea utilizar.

Por ejemplo, si desea instalar un paquete, se puede detectar si estás en un Debian como sistema o un RedHat-como el sistema mediante la comprobación de la existencia de dpkg o rpm (comprobar dpkg en primer lugar, porque las máquinas Debian puede tener el comando rpm en ellos...). Tomar la decisión de qué hacer sobre la base de que, no sólo en si es un Debian o RedHat del sistema. De esa manera usted tendrá automáticamente el apoyo derivado de las distribuciones que usted no explícitamente programa. Ah, y si tu paquete requiere dependencias específicas, haga una prueba para aquellos que son demasiado y que el usuario sepa lo que falta.

Otro ejemplo es jugueteando con las interfaces de red. Trabajar de lo que hacer sobre la base de si hay un /etc/network/interfaces o archivo /etc/sysconfig/network-scripts del directorio, e ir de allí.

Sí, es más trabajo, pero a menos que usted desea rehacer todos los errores que los desarrolladores web han hecho durante la última década o más, podrás hacerlo de forma inteligente desde el principio.

17voto

grapefrukt Puntos 16804

Usted puede encontrar la versión del kernel ejecutando uname -a, la búsqueda de la distribución de la versión depende de la distro.

En Ubuntu y algunos otros OS' puede ejecutar lsb_release -a o leer /etc/lsb_release

Debian almacena la versión en /etc/debian_version

6voto

Mark Turner Puntos 1452

La mayoría de las distribuciones tienen un único método de determinación de la distribución en particular.

Por ejemplo:

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

SUSE: /etc/SUSE-release

No hay un estándar ahí fuera conocido como el Linux Standard Base o LSB. Se define que debe haber un archivo llamado /etc/lsb-release o un programa que se llama lsb_release que se hacen eco de la información acerca de su distribución de linux.

lsb_release -a

5voto

Node Puntos 1409

Además de las otras respuestas: Si sólo desea analizar un archivo, la mayoría de las distribuciones de personalizar el tty inicio de sesión a través de /etc/issue por ejemplo:

Bienvenido a SUSE Linux Enterprise Server 10 SP2 (i586) - Kernel \r (\l).

Y sí, sé que es subóptima. :)

0voto

Omar Shahine Puntos 886

No hay ninguna cruz-vía de distribución. Sin embargo:

  • Redhat y amigos: de Prueba para /etc/redhat-release, el contenido de verificación
  • Debian: Prueba de /etc/debian_version, el contenido de verificación
  • Mandriva y amigos: de Prueba para /etc/versión, el contenido de verificación
  • Slackware: Prueba de /etc/slackware-versión, el contenido de verificación

Etc. Generalmente hablando, compruebe /etc/*-release y /etc/*-version.


Edit: Encontré un viejo (1+ años) bash script de la mina en todo mentira de que debe haber improvisado a través de los años (tiene un impresionante registro CVS volviendo 6 años). Es posible que no funcione correctamente, ya que-es y no puede ser molestado en buscar instalado distros para probar en contra, pero debe proporcionar un buen punto de partida. Funciona bien en CentOS, Fedora y Gentoo. gyaresu probado con éxito en 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
}

Tenga en cuenta que esta será probablemente sólo funcionan correctamente en Bash. Puede escribirlo ofr otros shells.

Dicho esto, es posible que desee probar en características, no para las distribuciones. Yo no uso este ya simplemente porque se convirtió en una carga de mantenimiento. Es más fácil confiar en la distribución de herramientas y soluciones.


Conceptualmente, lo que hace es, en este orden:

  • Tire de un conocido, "común de los guiones de inicio de la función" tipo de archivo. Esos son específicas de cada distribución. Si no existe, pase a la siguiente distribución de verificación.
  • Comprobar la existencia de un procedimiento específico, conocido por existir, que se usan a menudo y es improbable que sea cambiado el nombre de la función a partir de ese núcleo de secuencia de comandos. Hacemos que el uso de la type Bash builtin. type -t devuelve function si que es un símbolo de función. Nos anteponer zz a la salida de type -t 2>/dev/null porque si el nombre no está definida la cadena de salida sería vacío y obtendríamos un error de sintaxis sobre la ausencia de una mano izquierda a la == operador. Si el nombre que acabamos de no es una función, pase a la siguiente distribución de verificación, de lo contrario, se encontró que el tipo de distribución.
  • Por último, echo el tipo de distribución por lo que la función de salida puede ser fácilmente utilizado en un caso .. esac bloque.


Editar en caso de que usted está tratando de ejecutar esto como una escalera de secuencia de comandos: Esta secuencia de comandos se suponía que iba a obtener de origen o incluyen desde otros scripts. No salida de cualquier cosa en su propio si se ejecuta tal como es. Para probarlo, fuente y, a continuación, invocar la función, por ejemplo:

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

en el prompt de bash.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: