it-swarm-es.com

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

A veces, sus scripts deben comportarse de manera diferente en diferentes Linux. ¿Cómo puedo determinar en qué versión de Linux se ejecuta un script?

29
jldugger

No intente hacer suposiciones basadas en la distribución en cuanto a lo que puede y no puede hacer, ya que de esa forma se encuentra la locura (consulte también "Detección de agente de usuario"). En su lugar, detecta si lo que quieres hacer es compatible y cómo lo hace cualquier comando o ubicación de archivo que quieras usar.

Por ejemplo, si desea instalar un paquete, puede detectar si se encuentra en un sistema similar a Debian o en un sistema similar a RedHat al verificar la existencia de dpkg o rpm (verifique primero dpkg, porque las máquinas Debian pueden tener el comando rpm en ellos ...). Tome su decisión sobre qué hacer basándose en eso, no solo en si se trata de un sistema Debian o RedHat. De esa forma, admitirá automáticamente cualquier distribución derivada que no haya programado explícitamente. Ah, y si su paquete requiere dependencias específicas, pruebe también esas y deje que el usuario sepa lo que falta.

Otro ejemplo es jugar con las interfaces de red. Determine qué hacer en función de si hay un archivo/etc/network/interfaces o un directorio/etc/sysconfig/network-scripts, y vaya desde allí.

Sí, es más trabajo, pero a menos que desee rehacer todos los errores que los desarrolladores web han cometido en la última década o más, lo hará de manera inteligente desde el principio.

27
womble

No hay forma de distribución cruzada. Sin embargo:

  • Redhat y amigos: Prueba para /etc/redhat-release, verifique el contenido
  • Debian: prueba para /etc/debian_version, verifique el contenido
  • Mandriva y amigos: Prueba para /etc/version, verifique el contenido
  • Slackware: prueba para /etc/slackware-version, verifique el contenido

Etc. En términos generales, verifique /etc/*-release y /etc/*-version.


Editar: Encontré un viejo script de bash mío (1+ años) que debo haber improvisado a lo largo de los años (tiene un impresionante registro de CVS que data de hace 6 años). Puede que ya no funcione correctamente tal como está y puedo No se moleste en encontrar distribuciones instaladas para probar, pero debería proporcionarle un buen punto de partida. Funciona bien en CentOS, Fedora y Gentoo. gyaresu lo probó 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 esto probablemente solo funcionará correctamente en Bash. Podrías reescribirlo para otros proyectiles.

Dicho esto, es posible que desee probar las características, no las distribuciones. Ya no estoy usando esto simplemente porque se convirtió en una carga de mantenimiento. Es más fácil confiar en herramientas y soluciones de distribución cruzada.


Conceptualmente, lo que hace es, en orden:

  • Extraiga un tipo de archivo conocido, "función de secuencia de comandos de inicio común". Esos son específicos de distribución. Si no existe, pase a la siguiente verificación de distribución.
  • Verifique la existencia de una función específica, conocida por existir, de uso frecuente y poco probable que cambie de nombre a partir de ese script central. Hacemos eso usando el type Bash incorporado. type -t devuelve function si ese símbolo es una función. Anteponemos zz a la salida de type -t 2>/dev/null porque si el nombre no está definido, la cadena de salida estaría vacía y obtendríamos un error de sintaxis sobre la falta de la mano izquierda a la == operador. Si el nombre que acabamos de verificar no es una función, salte a la siguiente verificación de distribución, de lo contrario, encontramos el tipo de distribución.
  • Finalmente, repita el tipo de distribución para que la salida de la función se pueda usar fácilmente en un caso.

Edite en caso de que esté tratando de ejecutar esto como un script directo: se supone que este script debe obtenerse o incluirse de otros scripts. No genera nada por sí solo si lo ejecuta como está. Para probarlo, búsquelo y luego invoque la función, por ejemplo:

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

en el bash Prompt.


Editar: tenga en cuenta que este script no requiere privilegios de root. Te insto a que no lo ejecutes como root. No debería dañar nada, pero no hay necesidad.


Encontré un enlace a una publicación de lista de correo relevante en el registro de CVS. Debería ser útil para desenvolver los espaguetis de script de inicio.

36
Mihai Limbăşan

Puede encontrar la versión del kernel ejecutando uname -a, encontrar la versión de distribución depende de la distribución.

En Ubuntu y algunos otros SO 'puedes ejecutar lsb_release -a o lee/etc/lsb_release

Debian almacena la versión en/etc/debian_version

17
Adam Gibbins

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

Por ejemplo:

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

SUSE: /etc/SUSE-release

Existe un estándar conocido como Linux Standard Base o LSB . Define que debe haber un archivo llamado/etc/lsb-release o un programa llamado lsb_release que hará eco de la información sobre su distribución de Linux.

lsb_release -a
6
Mark Turner
python -c 'import platform ; print platform.dist()[0]'

código: http://hg.python.org/cpython/file/2.7/Lib/platform.py

6
jkeogh

Además de las otras respuestas: si solo desea analizar un archivo, la mayoría de las distribuciones personalizan el inicio de sesión de tty 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óptimo. :)

5
Node

facter es una herramienta útil para este tipo de descubrimiento, aunque probablemente utiliza algunos de los métodos detallados anteriormente y requiere Ruby.

4
Cawflands

Todo lo que necesitas hacer es escribir uname -a en tu Shell favorito. Eso imprimirá el nombre y la versión del núcleo.

2
user1797

También puede obtener la versión por

cat /proc/version

o/p:

Linux versión 2.6.17-13mdv ([email protected]) (gcc versión 4.1.2 20070302 (prelanzamiento) (4.1.2-1mdv2007.1)) # 1 SMP viernes 23 de marzo 19:03:31 UTC 2007

2
prasanna

Estoy de acuerdo con Mark, Adam y Mihai (no puedo votar debido a una reputación insuficiente). Las soluciones basadas en LSB y su relativo FHS funcionarán con la mayoría de las distribuciones y es probable que continúen funcionando en el futuro. LSB y FHS son tus amigos.

2
David J. Liszewski

He encontrado que cat /etc/*release* casi siempre funciona.

2
ibuys

La versión de Linux es una pregunta difícil. Si lo miramos de forma limitada, tenemos la versión del núcleo que puede obtener con "uname -r ". La versión de distribución es en su mayoría irrelevante. Algunas distribuciones son mejores (distribuciones empresariales como Redhat Enterprise Linux). Otras distribuciones como Gentoo son básicamente objetivos móviles que no tienen una versión sensible. Si necesita hacer cosas basadas en la versión, Eche un vistazo a los principales componentes que son relevantes para usted:

Component       Version command
glibc           /lib/libc.so.6
gcc             gcc --version
X               xdpyinfo
libX11          pkg-config --modversion x11
gtk+            pkg-config --modversion gtk+-2.0
qt-4            pkg-config --modversion QtCore

   etc...
1
Paul de Vrieze

También puede consultar el menú de Grub, generalmente le ofrece un montón de información de distribución/versión :-)

1
Antoine Benkemoun