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_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
comando es relativamente nuevo, ¿y si tengo que obtener el sistema operativo de un sistema anterior?
En cualquier caso, lsb
significa , Linux Standard Base
así que supongo que no funcionará en unidades que no sean Linux. Hasta donde yo sé, no hay forma de obtener esta información, uname
entonces, ¿cómo puedo obtener esto en sistemas que no usan lsb_release
?
uname -s
debería ser suficiente fuera de Linux (espere posiblemente para los BSD).facter
?facter operatingsystem
debe hacer lo que quiere en todos los sistemas con los quefacter
se trabajó.facter
código que obtiene el nombre del sistema operativo en pastebin. Encuéntralo aquí . Comprueba muchos archivos diferentes para obtener el nombre de manera confiable.Respuestas:
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
comando 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
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
Esta misma página también incluye un útil script que intenta codificar lo anterior utilizando solo
uname
comandos 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
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.
Este fragmento de código podría incluirse en un sistema
/etc/bashrc
o 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 comandogcc --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
CentOS 5.x
CentOS 6.x
Ubuntu 12.04
TL; DR;
Entonces, ¿cuál debo usar? Tendería a elegir
lsb_release -a
cualquier distribución de Linux que frecuentara (RedHat, Debian, Ubuntu, etc.). Para situaciones en las que está apoyando sistemas que no proporcionanlsb_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
Aquí está la respuesta de Rob
fuente
Como probablemente no podrá instalar
facter
en un servidor remoto, puede imitar lo que hace para encontrar el nombre del sistema operativo. El código de Ruby para eloperatingsystem
hecho se puede encontrar aquí en pastebin . Básicamente, examina los diferentes*-release
archivos y otros para determinar el nombre del sistema operativo.Algunos de los archivos que mira:
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.fuente
... | uniq
?... | sort -u
.uniq
solo encuentra elementos únicos adyacentes.En caso de que haya
python
instalado (no importa si Python 3 o Python 2), puede encontrar el nombre de la distribución sin reinventar la rueda :fuente
/etc/issue
debe 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:El problema / etc / también se menciona en el FHS (que no es solo para sistemas Linux), aunque es "opcional".
fuente
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./etc/issue
Es completamente poco confiable. (He visto sistemas en la versión XY con un/etc/issue
banner que dice que eran YZ después de una mala gestión de parches. Puede contener absolutamente cualquier cosa.)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'.
fuente
Usé este comando de shell para obtener una cadena que indica la distribución de Linux:
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
fuente
for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; done
funcionaría igual de bien en todos ellos? No entiendo por qué primerofind
ingresarías todos los archivos/etc
.SNMP es un protocolo lo suficientemente ubicuo como para encontrarse en muchos tipos diferentes de distribuciones GNU / Linux y sistemas UNIX.
El
system.sysDescr.0
objeto 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:La página de
snmpget(1)
manual explica cómo recuperar este valor con ejemplos.fuente
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 ...
fuente
Por lo que he logrado deducir de este hilo, deberías poder obtener la información de casi cualquier sistema usando:
fuente
ls
. Él lex la salida dels
. Pero sí ... Esto está mal porque/etc/issue
es 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.more reliable options
Bueno, 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 halsb
instalado por defecto.Si una situación lo requiere, puede averiguarlo de forma remota utilizando snmpwalk [o el protocolo SNMP en general]. Un ejemplo está abajo:
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.
fuente
snpwalk
? ¿Dónde puedo encontrarlo? Además, eso solo imprime "Linux", sin información de distribución (que es lo que quiero,uname
me puede darLinux
). ¿Funciona en sistemas operativos que no sean Linux? ¿En UNIX, por ejemplo, BSD u OSX?uname -a
y 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).it also prints the kernel version which is really the only thing you need
Pero ... ese es el punto central de esta pregunta. Si eso fuera realmente todo lo que necesitabas, podrías usarlouname -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.Uso
/etc/os-release
: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_release
que hasta ahora es la respuesta más votada desde 2013.fuente
/etc/os-release
se 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./etc/os-release
están ausentes? Supongo que su base de usuarios es miserable en comparación con los sistemas quelsb_release
no 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 delsystemd
enlace 0pointer.de que proporcioné.os-release
es 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.lsb_release
y puede reemplazar C con Go y obtener el mismo argumento. La sobrecarga de la ejecuciónlsb_release
es 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