GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo obtener de forma fiable el nombre del sistema operativo?

lsb_release -a es probable que sea su mejor opción para encontrar esta información y poder hacerlo de manera consistente.

Historia de LSB

El lsb en ese comando se refiere al proyecto Base de estándares de Linux, que es un proyecto general patrocinado por la Fundación Linux para proporcionar métodos genéricos para hacer cosas básicas en varias distribuciones de Linux.

El proyecto es voluntario y los proveedores pueden participar en el proyecto como usuarios y también como facilitadores de las diversas especificaciones en torno a diferentes módulos que ayudan a impulsar la estandarización dentro de las diferentes distribuciones de Linux.

extracto de la carta

El grupo de trabajo de LSB tiene como objetivo central abordar estas dos preocupaciones. Publicamos un estándar que describe el conjunto mínimo de APIsa que debe soportar la distribución, en consulta con los principales proveedores de distribución. También proporcionamos pruebas y herramientas que miden la compatibilidad con el estándar y permiten que los desarrolladores de aplicaciones apunten al conjunto común. Finalmente, a través de nuestro trabajo de prueba, buscamos evitar divergencias innecesarias entre las distribuciones.

Enlaces útiles relacionados con LSB

  • Carta LSB
  • Grupo de trabajo LSB
  • Hoja de ruta de LSB
  • Lista de correo LSB (¡la actividad actual está aquí!)
  • Lista de productos LSB certificados
  • Página de Wikipedia de LSB

Críticas

Hay una serie de problemas con LSB que lo hacen problemático para distribuciones como Debian. El uso forzado de RPM es uno. Consulte el artículo de Wikipedia para obtener más información sobre el tema.

Novela

Si busca, posiblemente encontrará una página bastante anticuada titulada:Detectar la distribución subyacente de Linux de Novell. Este es uno de los pocos lugares donde he visto una lista real que muestra varias de las principales distribuciones y cómo puede detectar qué subyacente está usando.

extracto

Novell SUSE         /etc/SUSE-release
Red Hat             /etc/redhat-release, /etc/redhat_version
Fedora              /etc/fedora-release
Slackware           /etc/slackware-release, /etc/slackware-version
Debian              /etc/debian_release, /etc/debian_version,
Mandrake            /etc/mandrake-release
Yellow dog          /etc/yellowdog-release
Sun JDS             /etc/sun-release
Solaris/Sparc       /etc/release
Gentoo              /etc/gentoo-release
UnitedLinux         /etc/UnitedLinux-release
ubuntu              /etc/lsb-release

Esta misma página también incluye una secuencia de comandos práctica que intenta codificar lo anterior usando solo vainilla uname comandos y la presencia de uno de los archivos anteriores.

NOTA: Esta lista está fechada, pero puede eliminar fácilmente las distribuciones fechadas como Mandrake de la lista y reemplazarlas con alternativas. Este tipo de secuencia de comandos podría ser un enfoque si intenta admitir una gran cantidad de variantes de Solaris y Linux.

La mafia de Linux

Más búsquedas aparecerán en la siguiente página mantenida en Linuxmafia.com, titulada:/etc/release equivalentes para diversas distribuciones de Linux (y otras Unix). Esta es probablemente la lista más exhaustiva hasta la fecha que he visto. Podría codificar esta lista con una declaración de caso/cambio e incluirla como parte de su distribución de software.

De hecho, hay un script al final de esa página que hace exactamente eso. Así que simplemente puede descargar y usar el script como un tercero para su distribución de software.

guion

#!/bin/sh
# Detects which OS and if it is Linux then it will detect which Linux
# Distribution.

OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`

GetVersionFromFile()
{
    VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}

if [ "${OS}" = "SunOS" ] ; then
    OS=Solaris
    ARCH=`uname -p` 
    OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
elif [ "${OS}" = "AIX" ] ; then
    OSSTR="${OS} `oslevel` (`oslevel -r`)"
elif [ "${OS}" = "Linux" ] ; then
    KERNEL=`uname -r`
    if [ -f /etc/redhat-release ] ; then
        DIST='RedHat'
        PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/SuSE-release ] ; then
        DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
        REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
    elif [ -f /etc/mandrake-release ] ; then
        DIST='Mandrake'
        PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/debian_version ] ; then
        DIST="Debian `cat /etc/debian_version`"
        REV=""

    fi
    if [ -f /etc/UnitedLinux-release ] ; then
        DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
    fi

    OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"

fi

echo ${OSSTR}

NOTA: Esta secuencia de comandos debería resultarle familiar, ¡es una versión actualizada de la de Novell!

Guión de espacio para las piernas

Otro método que he visto empleado es crear su propia secuencia de comandos, similar al método anterior de Novell pero utilizando LSB en su lugar. Este artículo titulado:Método genérico para determinar el nombre de distribución de Linux (o UNIX), muestra uno de esos métodos.

# 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

Este fragmento de código podría incluirse en el /etc/bashrc de un sistema o algún archivo de este tipo que luego establecería la variable de entorno $DISTRO .

cc

Lo creas o no, otro método es hacer uso de gcc . Si consulta el comando gcc --version obtendrá la distribución para la que se creó gcc, que es invariablemente la misma que el sistema en el que se ejecuta.

Fedora 14

$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.

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.

TL;RD;

Entonces, ¿cuál debo usar? Yo tendería a ir con lsb_release -a para cualquier distribución de Linux que frecuentaría (RedHat, Debian, Ubuntu, etc.). Para situaciones en las que admite sistemas que no proporcionan lsb_release Haría el mío propio como parte de la distribución del software que estoy proporcionando, similar a uno de los scripts anteriores.

ACTUALIZACIÓN #1:Seguimiento con SuSE

Al hablar con @Nils en los comentarios a continuación, se determinó que, por alguna razón, SLES11 parecía dejar de instalar LSB de forma predeterminada. Era solo una instalación opcional, que parecía ir en contra de un paquete que brinda este tipo de función clave.

Así que aproveché la oportunidad para contactar a alguien del proyecto OpenSuSE para tener una idea de por qué.

extracto del correo electrónico

Hi Rob,

I hope you don't mind me contacting you directly but I found your info here: 
https://en.opensuse.org/User:Rjschwei. I participate on one of the StackExchange 
sites, Unix & Linux and a question recently came up regarding the best option 
for determining the underlying OS.

http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name/92218?noredirect=1#comment140840_92218

In my answer I suggested using lsb_release, but one of the other users mentioned 
that this command wasn't installed as part of SLES11 which kind of surprised me. 
Anyway we were looking for some way to confirm whether this was intentionally 
dropped from SLES or it was accidental.

Would you know how we could go about confirming this one way or another?

Thanks for reading this, appreciate any help and/or guidance on this.

-Sam Mingolelli
http://unix.stackexchange.com/users/7453/slm

Esta es la respuesta de Rob

Hi,

On 10/01/2013 09:31 AM, Sam Mingo wrote:
- show quoted text -

lsb_release was not dropped in SLES 11. SLES 11 is LSB certified. However, it 
is not installed by default, which is consistent with pretty much every other
distribution. The lsb_release command is part of the lsb-release package.

At present almost every distribution has an entry in /etc such as 
/etc/SuSE-release for SLES and openSUSE. Since this is difficult for ISVs and 
others there is a standardization effort going on driven by the convergence to 
systemd. The standard location for distribution information in the future will 
be /etc/os-release, although Ubuntu will probably do something different.

HTH,    
Robert

--  Robert Schweikert                           MAY THE SOURCE BE WITH YOU    
SUSE-IBM Software Integration Center                   LINUX    
Tech Lead    
Public Cloud Architect 

Dado que probablemente no podrá instalar facter en un servidor remoto, puede imitar lo que hace para encontrar el nombre del sistema operativo. El código Ruby para el operatingsystem hecho se puede encontrar aquí en pastebin. Básicamente, mira a través de los diferentes *-release archivos y otros para determinar el nombre del sistema operativo.

Algunos de los archivos que examina:

/etc/debian_version
/etc/gentoo-release
/etc/fedora-release
/etc/mandriva-release
/etc/mandrake-release
/etc/meego-release
/etc/arch-release
/etc/oracle-release
/etc/enterprise-release
/etc/ovs-release
/etc/vmware-release
/etc/redhat-release
/etc/SuSE-release
/etc/bluewhite64-version
/etc/slamd64-version
/etc/slackware-version
/etc/alpine-release
/etc/system-release
/etc/centos-release

Lo siento si encuentra duplicados en esta lista, la produje rápidamente con grep . Debería ser bastante fácil (aunque un poco tedioso) trasladar esto a un script de shell POSIX.


En caso de que tengas python instalado (no importa si Python 3 o Python 2), puede averiguar el nombre de la distribución sin reinventar la rueda :

python -c "import platform;print(platform.linux_distribution()[0])"

Linux
  1. Linux:¿cómo obtener de manera confiable el nombre del sistema operativo?

  2. ¿Cómo puedo obtener el estado del teclado en Linux?

  3. ¿Cómo puedo obtener la carpeta temporal de una máquina que ejecuta maven?

  4. ¿Cómo obtener información del sistema operativo de la instancia Amazon EC2?

  5. Cómo obtener la resolución del monitor actual o el nombre del monitor (LVDS, VGA1, etc.)

Cómo obtener el tamaño de un directorio en Linux

¿Cómo recuperar la notificación de Skype en la bandeja del sistema?

¿Dónde puedo encontrar la primera versión del sistema operativo Linux?

¿Cómo puedo obtener la duración de un archivo de video desde la consola?

Si conozco el número PID de un proceso, ¿cómo puedo obtener su nombre?

¿Cómo obtener el nombre de la computadora (no su nombre de host)?