Você também pode usar o comando lsb_release
. Se você já tiver certeza de que é o RHEL, obter o número da versão principal é:
majversion=$(lsb_release -rs | cut -f1 -d.)
Eu trabalho em um ambiente em que estamos lentamente fazendo a transição de máquinas do Red Hat Enterprise Linux 5 para o RHEL 6.
Eu preciso de alguns dos meus scripts para fazer algo sutilmente diferente em máquinas RHEL6 para o que está sendo feito atualmente em máquinas RHEL5.
A solução pragmática é verificar em tempo de execução e executar alguns comandos no RHEL5, outros no RHEL6 e alguns em ambos.
Um exemplo prático disso é que estamos usando módulos de ambiente e meu .bashrc
inclui uma linha module load git
, mas em máquinas RHEL6 esses erros de comando:
RHEL6 system, git should be installed - not loading module
Olhando no modulefile, encontro o seguinte 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 {
...
}
Isso parece fazer o que eu quero, mas eu estava esperando por algo mais curto.
Então, qual é a maneira mais fácil de dizer ao RHEL5 a partir do RHEL6 em um script bash?
O ideal é que ele seja robusto em diferentes versões principais, mas seja tolerante a variações em números menores de lançamentos.
if grep -q -i "release 6" /etc/redhat-release
then
echo "running RHEL 6.x"
fi
Esta seria a maneira mais simples de pensar.
Use rpm -q |grep redhat-release-server
O arquivo /etc/redhat-release
pode ter sido editado por um administrador que deseja instalar software de terceiros sem executar uma atualização real do sistema operacional.
Você pode expandir isso para várias distribuições do Linux usando o arquivo /etc/issue
em vez do arquivo /etc/redhat-release
.
major_version=$(rpm -q --queryformat '%{RELEASE}' rpm | grep -o [[:digit:]]*\$)
rpm -q --queryformat '%{RELEASE}' rpm
imprime algo como 25.el7
. Então é só questão de tirar o (s) último (s) dígito (s). Testado nos RHELs 5,6,7 e Fedora 24.
Como outros salientaram, lsb-version
pode não estar instalado. Além disso, há pelo menos um sistema RHEL5 que não possui o pacote redhat-release-server
instalado.
Acabei usando a jordanm resposta, mas adicionando uma reviravolta.
Porque eu não queria ter todos os meus comandos rhel6 juntos e todos os meus comandos rhel5 juntos, mas intercalados dentro de sua própria seção, e eu não queria ter que replicar esse código toda vez que eu queria trocar , em vez disso eu fiz isso:
if grep -q -i "release 6" /etc/redhat-release ; then
rhel6only=1
elif grep -q -i "release 5" /etc/redhat-release ; then
rhel5only=1
else
echo "Running neither RHEL6.x nor RHEL 5.x !"
fi
Dessa forma, eu poderia fazer coisas como:
# JDK
[ $rhel5only ] && module load java/6
[ $rhel6only ] && module load java/7
# Eclipse
module load eclipse
# Python
[ $rhel5only ] && module load python/2
[ $rhel6only ] && module load python/3
etc.
se sua intenção for gerenciar modulefiles por contexto, Eu sugiro que você verifique EasyBuild e alguma lógica relacionada, vivendo em formato Python:
Todos os métodos mencionados aqui dependem de arquivos de texto e, como tal, podem ser enganosos. Someoune com o acesso correto pode alterar o conteúdo de / etc / redhat-release, / etc / issue, etc. mesmo para ofuscar apenas essa informação. Um método mais confiável envolveria conhecer as versões do kernel normalmente fornecidas pela Red Hat em cada versão do RHEL:
Invariavelmente, até agora, você pode descobrir o lançamento do kernel executando uname -r
. Você pode ficar mais chique executando algo nos moldes de
uname -r | awk -F- '{print $1}'
Isso forneceria informações específicas sobre o kernel, como na tabela acima. Você pode conseguir paralelos com outras distribuições, se eles usarem consistentemente versões do kernel.
O RHEL 6 adicionou o arquivo / etc / system-release-cpe. Contém uma string :
-separada que pode ser parecida com
# cat /etc/system-release-cpe
cpe:/o:redhat:enterprise_linux:6computenode:ga:computenode
Agora basta puxar os campos $ 5 e $ 7 para obter a versão RHEL e a variante RHEL.
# will be 7 or 6, does not work for 5 as file is missing there
RHEL_VERSION_MAJOR=$(cat /etc/system-release-cpe | awk -F: '{ print $5 }' | grep -o ^[0-9]*)
RHEL_VARIANT=$(cat /etc/system-release-cpe | awk -F: '{ print $7 }')
A partir do RHEL 6, a maneira mais concisa seria:
cat /etc/system-release-cpe | cut -d ':' -f5
Aqui está outra maneira mais precisa de obter esse resultado. Os pacotes do kernel no RHEL têm a string 'elN' incluída, onde N representa a versão principal do sistema operacional. Assim, pode-se executar o seguinte comando para identificar a versão do RHEL:
# uname -r | sed 's/^.*\(el[0-9]\+\).*$//'
Isso retornaria uma string, "el5", "el6" ou "el7", dependendo da string correspondente no host fornecido.