Determinar a distribuição do Linux

11

Estou tentando determinar qual o sabor do servidor linux está sendo executado. Não estou tentando determinar a versão do kernel - mas avalie o distribuidor.

O gcc está instalado e, na versão, diz RedHat

# gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11)

Isso significa que posso assumir com segurança que meu servidor é um servidor RedHat. Existe um método melhor - 100% à prova de balas para descobrir isso? Também para outros sabores do Linux - não apenas este servidor?

Edit: conteúdo de /etc/caso isso ajude - mas eu gostaria de uma solução que funcione para outras versões do linux também.

# ls /etc/
./              backupmxhosts  domainusers     host.conf     localdomains  mailips        pam.d/      relayhosts               shadow              trustedmailhosts
../             bashrc*        exim.conf       inputrc       localtime     man.config     passwd      resolv.conf              skipsmtpcheckhosts  userdomains
DIR_COLORS      cron.deny      exim.pl         ld.so.cache   lynx.cfg      mtab           profile     secondarymx              spammeripblocks     vimrc
aliases         demodomains    exim.pl.local*  ld.so.conf    mail/         my.cnf         profile.d/  senderverifybypasshosts  sudoers
antivirus.exim  demouids       group           localaliases  mailhelo      nsswitch.conf  protocols   services                 termcap

Não tenho arquivos *releaseou*version/etc/

# ls /etc*release; ls /etc/*version
/bin/ls: /etc/*release: No such file or directory
/bin/ls: /etc/*version: No such file or directory

Eu tentei LSB

# lsb_release -a
LSB Version:
Distributor ID: n/a
Description:    (none)
Release:        n/a
Codename:       n/a

Além disso - acho que estou dentro de um chroot jail(não tenho certeza do que é isso) que provavelmente poderia ser a causa desse problema.


Atualizada:

Eu acho que isso faz isso por mim. Acho que posso assumir com segurança que estou usando cent-os.

# cat /proc/version
Linux version 2.6.9-103.plus.c4smp ([email protected]) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)) #1 SMP Wed Dec 21 16:17:23 EST 2011
Billy Moon
fonte
Por que você precisa saber? Talvez, em vez disso, testar ferramentas comuns específicas da distribuição (gerenciadores de pacotes, por exemplo) faça o que você deseja?
Daniel Pryden #
1
Bem, o que realmente quero saber é se posso replicar o servidor como uma máquina virtual localmente, e instalar coisas na máquina virtual local e copiar os binários para a máquina remota. Eu pensei que descobrir a plataforma correta seria um bom ponto de partida.
Billy Moon
2
A lista de diretórios acima está incompleta (por exemplo, faltam hosts, init.d, rc *). Isso é um teste?
Como você está acessando este servidor? É possível que você não tenha acesso diretamente ao sistema de arquivos do servidor, mas esteja dentro de uma prisão chroot?
Daniel Pryden #
Acho que posso estar dentro de uma prisão de chroot - isso significa que não consigo descobrir qual é o sistema subjacente?
Billy Moon

Respostas:

4
cat /proc/version

Exemplos:

  1. Ubuntu:

    $ cat /proc/version
    Linux version 3.11.0-13-generic (buildd@roseapple) (gcc version 4.8.1 \
    (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013
    
  2. Red Hat / CentOS:

    $ cat /proc/version
    Linux version 2.6.32-220.13.1.el6.x86_64 ([email protected]) \
    (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Apr 17 23:56:34 BST 2012
    

Veja também Como saber qual distribuição Linux você está usando?

vitaut
fonte
Isso mostra onde o kernel foi compilado e não em qual distribuição você executa. Em muitos casos, o kernel está sendo compilado na mesma distribuição, mas em uma versão mais antiga.
Pabouk
13

Nas distribuições Linux mais modernas, o seguinte comando fornecerá suas informações:

lsb_release -a
Alpha01
fonte
1
Não, isto não é verdade. Isso funciona somente para derivados do Debian e
MariusMatutiae
1
Este comando não é instalado por padrão no Red Hat e derivados (ou seja, CentOS). Você tem que instalá-lo explicitamente antes do uso: yum install redhat-lsb-core.
Pabouk
@MariusMatutiae, na verdade, é muito mais difundido do que isso, mas nem sempre é instalado por padrão.
terdon
@terdon obrigado, eu não sabia disso.
MariusMatutiae
@MariusMatutiae veja aqui para mais informações, parece estar ausente do SuSe, mas deve estar instalado no RH.
terdon
9

/etc/issue pode ser um bom ponto de partida.

Mais informações podem ser encontradas inspecionando os arquivos de informações para diferentes distribuições:

Novell SuSE    /etc/SuSE-release
OpenSuSE       /etc/SuSE-release, /etc/os-release
Red Hat,CentOS /etc/redhat-release, /etc/redhat_version
Fedora         /etc/fedora-release, /etc/redhat-release, /etc/os-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
Amazon Linux   /etc/system-release
PLD Linux      /etc/pld-release, /etc/os-release
ArchLinux      /etc/arch-release, /etc/os-release

Veja o fórum Unix para mais detalhes.

e_z
fonte
1
infelizmente não tenho nenhum arquivo terminando releaseou versionno meu etcdiretório
Billy Moon
4

Se /etc/issueestiver faltando, pode haver um ou mais /etc/*_releasearquivos.

Por exemplo, meu sistema Ubuntu possui /etc/lsb-release:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.04
DISTRIB_CODENAME=natty
DISTRIB_DESCRIPTION="Ubuntu 11.04"

O sistema CentOS de um amigo (baseado no Red Hat) possui /etc/redhat-release:

CentOS release 5.6 (Final)

Não sei como isso é universal.

Keith Thompson
fonte
nenhum releaseou versionarquivos no meu/etc/
Billy Moon
@ BillyMoon Eu acredito que é recente que as distribuições Linux começaram a adicionar o utilitário lsb_release em sua distribuição. lsb_release -a
Alpha01 7/07
Obrigado pela dica - não me ajuda desta vez, infelizmente
Billy Lua
2

cat / etc / issue pode responder à sua pergunta.

Os fabricantes de distribuição não são amigáveis ​​para você aqui. Primeiro, cada um pensa que é o único caminho verdadeiro.

Provavelmente, em vez de tentar farejar a distribuição, você deve examinar mais detalhadamente a pergunta específica que realmente precisa responder. Concentre-se na funcionalidade que você está vendo, não na distribuição que a fornece. Afinal, uma nova versão de uma distro pode girar e seguir na direção oposta em qualquer eixo específico.

bmargulies
fonte
3
não existe /etc/issueno meu servidor
Billy Moon
Sim. Observe que /etc/issuepode conter seqüências de escape como \ne \l. Para ver o que isso significa man 5 issuee man getty(o /etc/issuearquivo é destinado principalmente para uso por getty). É claro que o proprietário do sistema pode editar /etc/issuepor algum motivo nefasto.
Keith Thompson
Eu acho que não /etc/issueé necessário existir ou conter qualquer informação sobre o fornecedor de distribuição. Geralmente acontece, mas acho que você não pode confiar nisso.
Daniel Pryden
@DanielPryden bem aprendemos algo todos os dias. Eu nunca tinha encontrado uma ausência antes.
bmargulies
1

Use facter(sim, é assim que se escreve).

O Facter é um companheiro para o fantoche, fornece variáveis ​​que podem ser consultadas e que contêm informações sobre o sistema.

Por exemplo, aqui estão apenas algumas das dezenas de variáveis ​​que esse fator pode retornar

$ facter
...
operatingsystem => CentOS
operatingsystemmajrelease => 6
operatingsystemrelease => 6.4
osfamily => RedHat
...

Você pode simplesmente consultar o fato da osfamília para ver se o servidor está executando o RedHat

$ facter osfamily
RedHat

Confira a documentação: http://puppetlabs.com/facter

spuder
fonte
0

uname -a

Funciona sempre para qualquer Tux

Lazy Badger
fonte
1
Isso relata a string da versão do kernel , o que pode estar muito errado se o host estiver executando um kernel de uma distribuição diferente - no bare metal ou por causa de uma ferramenta como OpenVZ ou VServers.
sarnold
Sim, mas suponho que, neste caso, o autor de Q saiba smth. sobre a situação. O kernel "Foreign" é um caso bastante estranho
Lazy Badger
0

Não existe uma maneira única e segura de fazer isso. Fiz uma pergunta semelhante no unix.se e a melhor maneira de obter essas informações é um script que verifica uma variedade de fontes:

#!/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}

A outra opção é realmente usar gcc --version, uma vez que gccé sempre compilado para uma distribuição específica, isso será relativamente portátil. Eu recomendo que você leia a resposta aceita na minha pergunta na U&L, que explica muito bem a situação.

Terdon
fonte
0

Este comando funcionou para distribuições baseadas no Debian e no Redhat: Usando o filtro tr, você converte o documento para o formato de uma palavra por linha e depois conta a primeira linha que contém o nome da distribuição.

tr -s ' \011' '\012' < /etc/issue | head -n 1
Yahya Yahyaoui
fonte
-1

Thos é o melhor método

cat /etc/*release
Unnikrishnan
fonte
Eu listei meu /etcdiretório na pergunta. Conforme discutido em outras respostas, esta solução não funciona para mim.
Billy Lua
Você tentou ls / etc * release; . Está errado. Tente ls / etc / * release. Ele vai trabalhar .am certeza
Unnikrishnan
Eu também fiz ls no /etc/diretório e você pode ver que nenhum arquivo lá terminam emrelease
Billy Lua