Trabajo en un entorno en el que estamos haciendo una transición lenta de máquinas de Red Hat Enterprise Linux 5 a RHEL 6.
Necesito algunos de mis scripts para hacer algo sutilmente diferente en las máquinas RHEL6 a lo que se está haciendo actualmente en las máquinas RHEL5.
La solución pragmática es verificar en tiempo de ejecución y ejecutar algunos comandos en RHEL5, otros en RHEL6 y algunos en ambos.
Un ejemplo práctico de esto es que estamos usando módulos de entorno y mi .bashrcincluye una module load gitlínea, pero en las máquinas RHEL6, este error de comando:
RHEL6 system, git should be installed - not loading module
Buscando en el archivo de módulo encuentro el siguiente código:
set redhatrelease [eval exec "cat /etc/redhat-release"]
if { [regexp -nocase {release 6} $redhatrelease] } {
puts stderr "\n\t RHEL6 system, git should be installed - not loading module\n"
} else {
...
}
Esto parece hacer lo que quiero, pero esperaba algo más corto.
Entonces, ¿cuál es la forma más fácil de distinguir RHEL5 de RHEL6 en un script bash?
Idealmente, debería ser robusto en las diferentes versiones principales, pero tolerar las variaciones en los números de versiones menores.

lsb_releaseel trabajo? (-rdebería darte solo el número; intenta también-aver todo lo que esté disponible) Si es así, también es un proveedor cruzado.gitmódulo Bash, verifique si existe antes de llamarlo. Cuando / si aparece más tarde, los resultados de su verificación cambian, por lo que de repente la función comienza a funcionar, sin ningún esfuerzo adicional.lsb_release -rincluye otro texto, por ejemploRelease: 5.8. Como Dennis Kaarsemaker explica , sin embargo, si se utilizalsb_release -rsen su lugar, se obtiene sólo el número.Respuestas:
También puedes usar el
lsb_releasecomando. Si ya está seguro de que es RHEL, obtener el número de versión principal es:fuente
lsb_releaseen mis máquinas RHEL / CentOS 5. No se encuentra en ninguna parte el 6 o 7.Esta sería la forma más simple en que puedo pensar.
fuente
lsb_releaseque parece funcionar solo para 5.Utilizar
rpm -q |grep redhat-release-serverEl
/etc/redhat-releasearchivo podría haber sido editado por un administrador que busca instalar software de terceros sin realizar una actualización real del sistema operativo.fuente
rpm -qalugar derpm -q? El uso-qpor sí solo requiere un argumento de consulta.7.4hasta que corrí con esto-qaPuede ampliar esto para múltiples distribuciones de Linux utilizando el
/etc/issuearchivo en lugar del/etc/redhat-releasearchivo.fuente
rpm -q --queryformat '%{RELEASE}' rpmimprime algo así25.el7. Entonces es solo cuestión de tomar los últimos dígitos. Probado en RHELs 5,6,7 y Fedora 24.Como otros señalaron,
lsb-versionno se puede instalar. Además, hay al menos un sistema RHEL5 que no tiene elredhat-release-serverpaquete instalado.fuente
Aquí hay otra forma más precisa de obtener este resultado. Los paquetes del kernel en RHEL tienen la cadena 'elN' incluida, donde N representaría la versión principal del sistema operativo. Por lo tanto, se podría ejecutar el siguiente comando para identificar la versión de RHEL:
Esto devolvería una cadena, "el5", "el6" o "el7", dependiendo de la cadena coincidente en el host dado.
fuente
Terminé usando la respuesta de Jordan , pero añadiendo un giro propio.
Debido a que no quería tener todos mis comandos rhel6 juntos y todos mis comandos rhel5 juntos, pero intercalado dentro de su propia sección, y no quería tener que replicar este código cada vez que deseaba cambiar, en su lugar hice esto:
De esa manera, podría hacer cosas como:
etc.
fuente
Si su intención adicional es administrar archivos de módulo por contexto, le sugiero que consulte EasyBuild y alguna lógica relacionada, viviendo en formato Python:
fuente
Todos los métodos mencionados aquí se basan en archivos de texto, y como tal podrían ser engañosos. Alguien con el acceso correcto puede cambiar el contenido de / etc / redhat-release, / etc / issue, etc. incluso para ofuscar esta información. Un método más confiable implicaría conocer las versiones del kernel que generalmente proporciona Red Hat en cada versión de RHEL:
invariablemente hasta ahora, puede encontrar la versión del kernel en ejecución ejecutando
uname -r. Puede ser más elegante ejecutando algo en la línea deEsto daría la información específica sobre el núcleo, como en la tabla anterior. Es posible que pueda manejar paralelos con otras distribuciones, si usan constantemente versiones de kernel.
fuente
RHEL 6 ha agregado el archivo / etc / system-release-cpe. Contiene una
:cadena separada que puede verse comoAhora es suficiente extraer los campos $ 5 y $ 7 para obtener la versión RHEL y la variante RHEL.
fuente
A partir de RHEL 6, la forma más concisa sería:
fuente
cut -d: -f5 /etc/system-release-cpuy evitaría el UUOC. Sin embargo, la pregunta era acerca de la transición de RHEL 5 a 6. Si esto solo funciona desde RHEL 6 en adelante, ¿no falla en satisfacer los requisitos de la pregunta?