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.
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}
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])"