¿Cómo puedo obtener de manera confiable el nombre del sistema operativo?

69

Digamos que he iniciado sesión en un sistema remoto, ¿cómo puedo saber qué está ejecutando? En la mayoría de los Linux modernos (¿Linuces?), Tiene el lsb_releasecomando:

$ 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_releasecomando es relativamente nuevo, ¿y si tengo que obtener el sistema operativo de un sistema anterior?

En cualquier caso, lsbsignifica , Linux Standard Baseasí que supongo que no funcionará en unidades que no sean Linux. Hasta donde yo sé, no hay forma de obtener esta información, unameentonces, ¿cómo puedo obtener esto en sistemas que no usan lsb_release?

terdon
fuente
1
unix.stackexchange.com/questions/6345/… para Linux. uname -sdebería ser suficiente fuera de Linux (espere posiblemente para los BSD).
Mat
¿Te has ido facter? facter operatingsystemdebe hacer lo que quiere en todos los sistemas con los que facterse trabajó.
Joseph R.
@JosephR. se ve bien pero no está instalado por defecto.
terdon
1
Pegué el factercódigo que obtiene el nombre del sistema operativo en pastebin. Encuéntralo aquí . Comprueba muchos archivos diferentes para obtener el nombre de manera confiable.
Joseph R.
@JosephR. wow, son muchos archivos. Lo portaré para golpear cuando tenga la oportunidad, eso debería ser lo suficientemente portátil. ¡Gracias!
terdon

Respuestas:

72

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 lsbcomando en ese significa el proyecto Linux Standards Base, 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 dentro del proyecto solo como un usuario y también como facilitadores de las diversas especificaciones en torno a los 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 su objetivo principal, abordar estas dos preocupaciones. Publicamos un estándar que describe el conjunto mínimo de API que una distribución debe admitir, en consulta con los principales proveedores de distribución. También proporcionamos pruebas y herramientas que miden el soporte para el estándar y permiten a los desarrolladores de aplicaciones apuntar 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

Criticas

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 al respecto .

Novell

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

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 útil script que intenta codificar lo anterior utilizando solo unamecomandos de vainilla 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 script podría ser un enfoque si está intentando admitir una gran variedad de variantes de Solaris y Linux.

Linux Mafia

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. Puede codificar esta lista con una declaración de caso / cambio e incluirla como parte de su distribución de software.

De hecho, hay una secuencia de comandos en la parte inferior de esa página que hace exactamente eso. Por lo tanto, simplemente puede descargar y usar el script como tercero para la distribución de su software.

guión

#!/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: ¡ Este script debería parecer familiar, es una versión actualizada del Novell!

Guión de espacio para las piernas

Otro método que he visto empleado es rodar su propia secuencia de comandos, similar al método Novell anterior, 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 estos 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 un sistema /etc/bashrco en algún archivo de este tipo que luego establecería la variable de entorno $DISTRO.

gcc

Lo creas o no, otro método es utilizarlo gcc. Si consulta el comando gcc --version, obtendrá la distribución para la que se creó gcc, que es invariablemente el mismo que el sistema en el que se está ejecutando.

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? Tendería a elegir lsb_release -acualquier distribución de Linux que frecuentara (RedHat, Debian, Ubuntu, etc.). Para situaciones en las que está apoyando sistemas que no proporcionan lsb_release, rodaría el mío como parte de la distribución de 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 cualquier motivo, SLES11 parecía dejar de instalar LSB por defecto. Era solo una instalación opcional, que parecía contraria a un paquete que proporciona este tipo de característica clave.

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

extracto de 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

Aquí está 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 
slm
fuente
1
Nota: Acabo de hacer una comprobación rápida en máquinas con AIX y SunOS. No parecen tener instalado lsb_release (y después de todo, esto es Unix, no Linux stack). El problema con gcc es que algunas personas ahora comienzan a usar clang. Además, nunca puede estar seguro de qué gcc se utilizó para compilar (en los sistemas con los que trabajo hay al menos pocas versiones en cada uno). Así que mi voto va a la solución Python, ya que parece estar instalada ahora en todas partes de forma predeterminada.
elmo
@elmo: sí, LSB es Linux Standard Base, por lo que no esperaría que AIX o SunOS lo tuvieran. Mi experiencia con SunOS es de más de 15 años, y la mayoría de los proveedores cuyo software con el que traté generalmente proporcionaría su propio script de shell similar a los que mencioné anteriormente. Hasta Solaris 11, Python no era una opción. Y esto es lo que hace que sea un hueso difícil de roer. Si proporciona software que necesita ejecutarse en Solaris 9, 10, 11, AIX y un par de distribuciones de Linux (SUSE, Ubntu y RHEL), ¿qué hace? Python no es una opción, por lo que te queda un script de shell codificado a mano.
slm
@elmo - gcc, sin embargo, una opción, tampoco parece ser tan atractiva para mí. Parece forjado con demasiados problemas, lo estaba demostrando simplemente como una opción.
slm
@elmo: mira el código detrás de esa función, hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . ¡Gran sorpresa es usar LSB!
slm
@slm: Tengo acceso a la máquina con SunOS 5.10 (que supongo que es 10 en su lista, no estoy tan familiarizado con los números de versión / convenciones de Sun) y tiene un Python. Tengo acceso a la máquina con AIX 7 y tiene Python. Las máquinas Linux obviamente también lo tienen. Entonces, Python parece la opción más portátil. En cuanto a Sun por debajo de 10, no estoy seguro de por qué no permitiría instalar Python (es cierto que falta la instalación actual, es decir, ncurses y ctypes, así que quién sabe). En cuanto a Python usando LSB, no es sorprendente para Linux si es un enfoque predeterminado.
elmo
16

Como probablemente no podrá instalar facteren un servidor remoto, puede imitar lo que hace para encontrar el nombre del sistema operativo. El código de Ruby para el operatingsystemhecho se puede encontrar aquí en pastebin . Básicamente, examina los diferentes *-releasearchivos y otros para determinar el nombre del sistema operativo.

Algunos de los archivos que mira:

/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 encuentras duplicados en esta lista, lo produje rápidamente con grep. Debería ser bastante fácil (aunque un poco tedioso) transferir esto a un script de shell POSIX.

Joseph R.
fuente
55
"Lo siento si encuentras duplicados en esta lista, lo produje rápidamente con grep". ... | uniq?
nuevo123456
@ new123456 Derecha. Gracias. La palabra clave aquí es "rápidamente" :)
Joseph R.
Lamento no aceptar esto, pero la respuesta de @ slm es demasiado completa para ignorarla :).
terdon
3
¿Qué pasa con / etc / os-release?
Yauhen Yakimovich
1
@ new123456 Técnicamente, eso debería ser ... | sort -u. uniqsolo encuentra elementos únicos adyacentes.
Parthian Shot
9

En caso de que haya pythoninstalado (no importa si Python 3 o Python 2), puede encontrar el nombre de la distribución sin reinventar la rueda :

python -c "import platform;print(platform.linux_distribution()[0])"
heinrich5991
fuente
Si tiene la tentación de usar esta opción, asegúrese de que su sistema operativo sea compatible: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Si no, puede agregar más a la lista: coderwall.com/p/cwrenq
slm
1
Esto no funcionará con distribuciones antiguas de Linux. Por ejemplo: SuSE 7.0 tenía Python 1.5.2 y el módulo de plataforma se ha agregado no antes del advenimiento de Python 2.3 en 2003 ;-)
pefu
6

/etc/issuedebe contener la información de lanzamiento. Estoy bastante seguro de que lo he visto en los sistemas Solaris. Aquí está el archivo de un sistema Debian moderno:

$ cat /etc/issue
Debian GNU/Linux 7 \n \l

$ 

El problema / etc / también se menciona en el FHS (que no es solo para sistemas Linux), aunque es "opcional".

drewbenn
fuente
Ah, esa es una buena sugerencia, +1. Puede que no siempre funcione, aunque The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.parece que depende del administrador del sistema escribir lo que desee.
terdon
2
/etc/issueEs completamente poco confiable. (He visto sistemas en la versión XY con un /etc/issuebanner que dice que eran YZ después de una mala gestión de parches. Puede contener absolutamente cualquier cosa.)
Mat
Se recomienda llenar ese archivo con. cosas legales como quién puede iniciar sesión.
Nils
Recomendado por pautas de seguridad y auditores. Hubo una vez un caso legal en el que un pirata informático salió sin castigo, porque hubo BIENVENIDO en / etc / issue
Nils
@drewbenn la página del manual dice lo que cité en mi primer comentario, no hay nada sobre su necesidad de contener la información del sistema. Simplemente lo hace a menudo.
terdon
6

No puede obtener de manera confiable el nombre de la distribución de un solo comando en todas las distribuciones. Algunos están disponibles a través de / etc / * - release y otros están disponibles a través del comando 'lsb-release'.

boz
fuente
Gracias, pero tampoco es una ayuda cuando se trata de Unix o cualquier otro no Linux * nix.
terdon
3

Usé este comando de shell para obtener una cadena que indica la distribución de Linux:

for f in $(find /etc -type f -maxdepth 1 \( ! -wholename /etc/os-release ! -wholename /etc/lsb-release -wholename /etc/\*release -o -wholename /etc/\*version \) 2> /dev/null); do echo ${f:5:${#f}-13}; done;

Este comando se basa en las respuestas de Joseph R. y SLM.

Solo busca archivos como / etc / {osname} -release o / etc / {osname} _version e imprime un nombre de sistema operativo particular.

Funcionó en

  • CentOS (centos)
  • RedHat (sombrero rojo)
  • Debian (debian)
  • Arco (arco)
  • OpenSUSE (OpenSUSE)
  • Fedora (fedora)
  • Ubuntu (debian)
scrutari
fuente
¿No for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; donefuncionaría igual de bien en todos ellos? No entiendo por qué primero findingresarías todos los archivos /etc.
terdon
Gracias por sus comentarios, terdon, pero su comando da 0 líneas en al menos Cent OS y Fedora
scrutari
1
0pointer.de/blog/projects/os-release.html para preguntas frecuentes
weberjn
1

SNMP es un protocolo lo suficientemente ubicuo como para encontrarse en muchos tipos diferentes de distribuciones GNU / Linux y sistemas UNIX.

El system.sysDescr.0objeto en el SNMPv2-MIB puede ayudarlo a averiguar con qué sistema operativo se está contactando, siempre que haya un demonio SNMP ejecutándose en el sistema de destino:

Descripción

Una descripción textual de la entidad. Este valor debe incluir el nombre completo y la identificación de la versión del tipo de hardware del sistema, el sistema operativo del software y el software de red.

Estado: actual

Acceso: solo lectura

La página de snmpget(1)manual explica cómo recuperar este valor con ejemplos.

Dawud
fuente
El inconveniente es que esta es una cadena estática que no se mantiene automáticamente.
Nils
1

Como no hay una forma común de hacerlo, definimos una cadena de liberación a través del comando snmp exec.

La tarea de ese comando es imprimir la distribución y la versión actual mayor / menor del sistema operativo.

En RH y clones analizamos / etc / redhat-release, en SuSe SuSe-release ...

Nils
fuente
Quienes somos nosotros'? ¿Y qué hay de Unix?
terdon
@terdon somos nuestro equipo en el trabajo. En Unix, puede hacer lo mismo si la extensión correspondiente se compila en snmpd.
Nils
Ah, pensé que eras parte de un grupo de estándares :)
terdon
@terdon Usted comienza a desarrollar estándares de sitio cuando tiene que administrar más de 80 servidores. Desarrollamos este método para poder monitorear si el sistema operativo está desactualizado (EoL menor o incluso mayor)
Nils
1

Por lo que he logrado deducir de este hilo, deberías poder obtener la información de casi cualquier sistema usando:

if which lsb_release &>> /dev/null; then
    lsb_release -a
elif [ -r /etc/issue ]; then
    cat /etc/issue
else
    ls /etc/ | grep -e '[_-]release$' -e '[_-]version$' | xargs -I % -n 1 cat /etc/%
fi
Sammitch
fuente
2
no analizar la salida de ls!
heinrich5991
@ heinrich5991 ¿por qué no?
Sammitch
Técnicamente, no está analizando la salida de ls. Él lex la salida de ls. Pero sí ... Esto está mal porque /etc/issuees completamente poco confiable. Completamente, completamente, totalmente poco confiable. Además, su suposición de que nadie podría poner un archivo no relacionado con el sistema operativo que termine en 'versión' o 'versión' es imprudente.
Parthian Shot
@ParthianShot ¿Entonces, principalmente, desea quejarse del segundo y tercer nivel de respaldo en el caso de que las opciones más confiables no estén disponibles?
Sammitch
@ Sammitch more reliable optionsBueno, para empezar , solo hay una opción. Entonces, incluso suponiendo que esté de acuerdo con su suposición de que es más confiable (que no lo hago), no comencemos a pluralizar las cosas. En segundo lugar, si alguien realmente usó su solución, y falló por completo la mitad del tiempo, no se sentiría consolado por el hecho de que estaba fallando en un "otro si". Ninguno de mis sistemas se ha lsbinstalado por defecto.
Parthian Shot
1

Si una situación lo requiere, puede averiguarlo de forma remota utilizando snmpwalk [o el protocolo SNMP en general]. Un ejemplo está abajo:

snmpwalk -Os -c <snmp community string> -v1 <hostname> sysDescr.0

OUPUT: sysDescr.0 = STRING: Linux example.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP sáb. Sep 14 05:32:37 EDT 2013 x86_64

La clave de la confiabilidad es si SNMP está configurado correctamente en su entorno, todos los hosts tienen snmp ejecutándose con la configuración de cadenas de comunidad adecuada.

xpros
fuente
¿Qué es snpwalk? ¿Dónde puedo encontrarlo? Además, eso solo imprime "Linux", sin información de distribución (que es lo que quiero, unameme puede dar Linux). ¿Funciona en sistemas operativos que no sean Linux? ¿En UNIX, por ejemplo, BSD u OSX?
terdon
snmpwalk es una utilidad de línea de comandos de Linux. No solo imprime "Linux", sino que también imprime la versión del núcleo, que es realmente lo único que necesita. Si SNMP está configurado en sus otros hosts, ya sea UNIX, BSD, OSX, snmpwalk funcionará como es un estándar (v1 | v2c | v3), e incluso funcionará a través del agua en los hosts de Windows también. Ver también snmpget o snmpgetnext.
xpros
Suena bien, pero ¿podría editar su respuesta y explicar dónde podemos encontrarla? No es en los repositorios de Debian, por ejemplo. Además, explique qué es lo que da uname -ay cómo me puede decir el nombre de la distribución, de eso se trata esta pregunta. De todos modos, incluso suponiendo que pueda devolver esta información, ya que es una utilidad no estándar y necesita ser instalada, no estoy seguro de que sea útil aquí. La idea es iniciar sesión en un sistema remoto y averiguar el sistema operativo (incluida la distribución si es Linux).
terdon
it also prints the kernel version which is really the only thing you needPero ... ese es el punto central de esta pregunta. Si eso fuera realmente todo lo que necesitabas, podrías usarlo uname -a. El núcleo es una parte importante de un sistema operativo, pero no es todo el sistema operativo. El diseño del sistema de archivos y las utilidades del usuario (por ejemplo, el administrador de paquetes) son importantes.
Parthian Shot
1

Uso /etc/os-release:

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.10 (Cosmic Cuttlefish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.10"
VERSION_ID="18.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=cosmic
UBUNTU_CODENAME=cosmic

Las razones se explican bien en las preguntas frecuentes mediante un enlace http://0pointer.de/blog/projects/os-release.html proporcionado gratuitamente por @weberjn en este comentario . Solo enumero aquí un argumento en contra de usar el lsb_releaseque hasta ahora es la respuesta más votada desde 2013.

Ya existe la herramienta lsb_release para esto, ¿por qué no lo usas?Bueno, es una interfaz muy extraña: un script de shell que debe invocar (y, por lo tanto, generar de forma asíncrona a partir de su código C), y no está escrito para ser extensible. Es un paquete opcional en muchas distribuciones, y nada que nos complacería invocar como parte del inicio temprano para mostrar un mensaje de bienvenida. (En tiempos con tiempos de arranque de espacio de usuario de menos de un segundo, realmente no queremos invocar un gran script de shell para una trivialidad como mostrar el mensaje de bienvenida). La herramienta lsb_release para nosotros parece ser un intento de abstraer las comprobaciones de distribución, donde se necesita la estandarización de las comprobaciones de distribución. Es simplemente una interfaz mal diseñada. En nuestra opinión, tiene su uso como interfaz para determinar la versión LSB en sí, pero no para verificar la distribución o la versión.

anatoly techtonik
fuente
Gracias, pero la respuesta aceptada ya aborda esto en la cita al final que explica que /etc/os-releasese volverá más estándar. Sin embargo, ese archivo no siempre está presente en todos los sistemas, por lo que la respuesta aceptada ofrece alternativas más portátiles. Además, no sé por qué mencionas el código C, la pregunta no es invocar nada de C.
terdon
@terdon Tengo curiosidad por saber cuáles son esos sistemas en 2018, ¿dónde /etc/os-releaseestán ausentes? Supongo que su base de usuarios es miserable en comparación con los sistemas que lsb_releaseno se envían por defecto. Al menos no pude usar tu respuesta aceptada en Fedora. En cuanto al comentario de C, no es mi, sino una cita del systemdenlace 0pointer.de que proporcioné.
anatoly techtonik
Sí, sé que no es tuyo, me preguntaba por qué sentías que una cita sobre el código C era relevante. Y hasta donde yo sé, os-releasees mayoritaria o exclusivamente una cosa de Linux. Parece estar definido por FreeDesktop.org, por lo que tal vez algunos sabores de Unix también lo usen, pero dudo que lo encuentre en la mayoría o en sistemas integrados o en cualquier sistema que no sea GUI, etc. Finalmente, no olvide que muchos lugares Todavía utilizo máquinas muy antiguas por razones de estabilidad.
terdon
La cita es sobre lsb_releasey puede reemplazar C con Go y obtener el mismo argumento. La sobrecarga de la ejecución lsb_releasees mucho mayor desde los puntos de seguridad y rendimiento que simplemente analizar el archivo estático. No creo en máquinas muy antiguas que brinden estabilidad. Heartbleed y amigos deberían haberlos quitado hace mucho tiempo, así que solo /etc/os-release
úselo