GNU/Linux >> Tutoriales Linux >  >> Linux

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

Digamos que estoy conectado a un sistema remoto, ¿cómo puedo saber qué está ejecutando? En la mayoría de los Linuxes modernos (¿Linuces?), tiene el lsb_release comando:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Que, por lo que puedo decir, solo da la misma información que /etc/lsb-release . ¿Qué pasa si ese archivo no está presente? Me parece recordar que el lsb_release El comando es relativamente nuevo, ¿qué pasa si tengo que obtener el sistema operativo de un sistema anterior?

En cualquier caso, lsb significa Linux Standard Base así que asumo que no funcionará en Unices que no sean Linux. Que yo sepa, no hay forma de obtener esta información de uname Entonces, ¿cómo puedo obtener esto en sistemas que no usan lsb_release? ?

Respuesta aceptada:

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 API
que debe admitir una 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 un script útil que intenta codificar lo anterior usando solo uname estándar. 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!

Relacionado:¿Cómo hacer un `tail -f` de archivos rotados de registro?

Guión de espacio para las piernas

Otro método que he visto empleado es ejecutar su propio script, 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 similar 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;DR;

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 

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

  2. ¿Cómo obtener solo el nombre del archivo con Linux 'buscar'?

  3. ¿Cómo obtener solo la ID del proceso en especificar el nombre del proceso en Linux?

  4. ¿Cómo obtener el sistema operativo actual en MSBuild?

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

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

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

Cómo obtener el nombre de archivo de la ruta completa en Linux

Cómo obtener la cantidad de procesadores/núcleos en Linux

Cómo cambiar el nombre de host en Debian Linux

¿Cómo obtener el tamaño físico de un archivo en Linux?