Digamos que estou conectado a um sistema remoto, como posso saber o que está sendo executado? Na maioria dos Linux modernos (Linuces?), Você tem o lsb_release
comando:
$ lsb_release -ic
Distributor ID: LinuxMint
Codename: debian
Que, até onde eu sei, fornece as mesmas informações que /etc/lsb-release
. E se esse arquivo não estiver presente? Lembro-me de que o lsb_release
comando é relativamente novo. E se eu precisar obter o sistema operacional de um sistema mais antigo?
De qualquer forma, lsb
significa Linux Standard Base
que estou assumindo que não funcionará em Unices que não sejam Linux. Tanto quanto eu sei, não há como obter essas informações, uname
então como posso obtê-las em sistemas que não usam lsb_release
?
uname -s
deve ser suficiente fora do Linux (espere possivelmente pelos BSDs).facter
?facter operatingsystem
você deve fazer o que deseja em todos os sistemasfacter
para que funcione.facter
código que obtém o nome do sistema operacional no pastebin. Encontre aqui . Ele verifica muitos arquivos diferentes para obter o nome de forma confiável.Respostas:
lsb_release -a
provavelmente será sua melhor opção para descobrir essas informações e poder fazê-lo de maneira consistente.História do LSB
O
lsb
comando nesse termo representa o projeto Linux Standards Base, que é um projeto abrangente patrocinado pela Linux Foundation para fornecer métodos genéricos para fazer coisas básicas em várias distribuições Linux.O projeto é voluntário e os fornecedores podem participar do projeto como apenas um usuário e também como facilitadores das várias especificações em torno de diferentes módulos que ajudam a impulsionar a padronização nas diferentes distribuições Linux.
trecho da carta
Links úteis relacionados ao LSB
Críticas
Existem vários problemas com o LSB que o tornam problemático para distribuições como o Debian. O uso forçado do RPM é um. Veja o artigo da Wikipedia para mais informações .
Novell
Se você pesquisar, provavelmente encontrará uma página com aparência bastante antiga, intitulada: Detecting Underlying Linux Distro da Novell. Este é um dos poucos lugares em que vi uma lista real que mostra várias das principais distribuições e como você pode detectar qual delas está sendo usada.
excerto
Essa mesma página também inclui um script útil que tenta codificar o que foi descrito acima usando apenas
uname
comandos vanilla e a presença de um dos arquivos acima.NOTA: Esta lista é datada, mas você pode facilmente remover as distribuições datadas, como Mandrake, da lista e substituí-las por alternativas. Esse tipo de script pode ser uma abordagem se você estiver tentando oferecer suporte a uma grande variedade de variantes do Solaris e Linux.
Máfia do Linux
Mais pesquisas aparecerão na seguinte página mantida no Linuxmafia.com, intitulada: / etc / release equivalents para diversas distribuições Linux (e outras Unix) . Esta é provavelmente a lista mais exaustiva que eu já vi. Você pode codificar esta lista com uma declaração case / switch e incluí-la como parte da sua distribuição de software.
De fato, há um script na parte inferior da página que faz exatamente isso. Assim, você pode simplesmente baixar e usar o script como terceiro na sua distribuição de software.
roteiro
NOTA: Esse script deve parecer familiar, é uma versão atualizada do Novell!
Script de espaço para as pernas
Outro método que vi empregar é lançar seu próprio script, semelhante ao método Novell acima, mas usando o LSB. Este artigo intitulado: Método genérico para determinar o nome da distribuição do Linux (ou UNIX) mostra um desses métodos.
Esse pedaço de código pode ser incluído no
/etc/bashrc
arquivo de um sistema ou em algum desses arquivos que definiria a variável de ambiente$DISTRO
.gcc
Acredite ou não, outro método é fazer uso
gcc
. Se você consultar o comando,gcc --version
obterá a distribuição para a qual o gcc foi criado, que é invariavelmente igual ao sistema em que está sendo executado.Fedora 14
CentOS 5.x
CentOS 6.x
Ubuntu 12.04
TL; DR;
Então, qual devo usar? Eu costumava usar
lsb_release -a
todas as distribuições Linux que eu freqüentava (RedHat, Debian, Ubuntu, etc.). Nas situações em que você oferece suporte a sistemas que não fornecem,lsb_release
eu faria o meu próprio como parte da distribuição do software que estou fornecendo, semelhante a um dos scripts acima.ATUALIZAÇÃO # 1: Acompanhamento do SuSE
Ao falar com o @Nils nos comentários abaixo, foi determinado que, por qualquer motivo, o SLES11 pareceu impedir que o LSB fosse instalado por padrão. Era apenas uma instalação opcional, que parecia contrária a um pacote que fornece esse tipo de recurso principal.
Então aproveitei a oportunidade para entrar em contato com alguém do projeto OpenSuSE para entender o porquê.
trecho de e-mail
Aqui está a resposta de Rob
fonte
Como você provavelmente não poderá instalar
facter
em um servidor remoto, imite o que ele faz para encontrar o nome do sistema operacional. O código Ruby para ooperatingsystem
fato pode ser encontrado aqui em pastebin . Basicamente, ele examina os diferentes*-release
arquivos e outros para determinar o nome do sistema operacional.Alguns dos arquivos analisados:
Sinto muito, se você encontrar duplicatas nesta lista, eu a produzi rapidamente com
grep
. Deve ser bastante fácil (embora um pouco entediante) portar isso para um script de shell POSIX.fonte
... | uniq
?... | sort -u
.uniq
só encontra elementos exclusivos adjacentes.Caso você tenha
python
instalado (não importa se Python 3 ou Python 2), você pode descobrir o nome da distribuição sem reinventar a roda :fonte
/etc/issue
deve conter as informações da versão. Estou bastante certo de que já o vi nos sistemas Solaris. Aqui está o arquivo de um sistema Debian moderno:/ etc / issue também é mencionado no FHS (que não é apenas para sistemas Linux), embora seja "opcional".
fonte
The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.
Parece que cabe ao administrador do sistema escrever o que ele / ela deseja./etc/issue
é completamente não confiável. (Eu tenho ver sistemas em versão XY com uma/etc/issue
bandeira que diz que eles foram YZ seguinte gerenciamento de patches mau Ele pode conter absolutamente nada..)Você não pode obter o nome da distribuição de forma confiável a partir de um único comando em todas as distribuições. Alguns estão disponíveis via / etc / * - release e outros estão disponíveis através do comando 'lsb-release'.
fonte
Eu usei este comando shell para obter uma string indicando a distribuição Linux:
este comando é baseado nas respostas de Joseph R. e slm.
Ele apenas procura arquivos como / etc / {osname} -release ou / etc / {osname} _version e imprime um nome de SO específico.
Trabalhou em
fonte
for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; done
funcionaria igualmente bem em todos eles? Não entendo por que você primeirofind
registraria todos os arquivos/etc
.O SNMP é um protocolo onipresente o suficiente para ser encontrado em muitos tipos diferentes de distribuições GNU / Linux e sistemas UNIX.
O
system.sysDescr.0
objeto no SNMPv2-MIB pode ajudá-lo a descobrir qual sistema operacional você está contatando, desde que exista um daemon SNMP em execução no sistema de destino:A página de
snmpget(1)
manual explica como recuperar esse valor com exemplos.fonte
Como não existe uma maneira comum de fazer isso, definimos uma string de liberação através do comando snmp exec.
A tarefa desse comando é imprimir a distribuição e a versão principal / secundária atual do sistema operacional.
No RH e nos clones, analisamos / etc / redhat-release, no SuSe SuSe-release ...
fonte
Pelo que consegui recolher a partir desta discussão, você deve conseguir obter informações de qualquer sistema usando:
fonte
ls
. Ele está lexing a saída dels
. Mas sim ... Isso está errado, porque/etc/issue
é completamente não confiável. Completamente, totalmente, totalmente não confiável. Além disso, sua suposição de que ninguém possa colocar um arquivo não relacionado ao sistema operacional que termina em 'release' ou 'version' é imprudente.more reliable options
Bem, por um lado, só há uma opção. Portanto, mesmo assumindo que concordei com sua suposição de que é mais confiável (o que não concordo), não vamos começar a pluralizar as coisas. Segundo, se alguém realmente usou sua solução, e ela falhou totalmente na metade do tempo, não seria consolada pelo fato de ela estar falhando em um "outro se". Nenhum dos meus sistemas foilsb
instalado por padrão.Se uma situação exigir, você poderá descobrir remotamente usando o snmpwalk [ou o SNMP protocal em geral]. Um exemplo está abaixo:
OUPUT: sysDescr.0 = STRING: Linux example.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP Sat 14 de setembro, 05:32:37 EDT 2013 x86_64
A chave para a confiabilidade é se o SNMP está configurado corretamente em seu ambiente, todos os hosts têm o snmp em execução com a configuração apropriada das strings da comunidade.
fonte
snpwalk
? Onde posso encontrá-lo? Além disso, isso apenas imprime "Linux", nenhuma informação de distribuição (que é o que eu quero,uname
pode me darLinux
). Funciona em sistemas operacionais não Linux? No UNIX digamos, ou BSD ou OSX?uname -a
não dá e como pode me dizer o nome da distribuição que é a questão. De qualquer forma, mesmo assumindo que ele possa retornar essas informações, por ser um utilitário não padrão e precisar ser instalado, não tenho certeza de que seria útil aqui. A idéia é fazer logon em um sistema remoto e descobrir o sistema operacional (incluindo distribuição, se for Linux).it also prints the kernel version which is really the only thing you need
Mas ... esse é o ponto principal desta questão. Se isso era realmente tudo o que você precisava, você poderia apenas usaruname -a
. O kernel é uma parte importante de um sistema operacional, mas não é o sistema operacional inteiro. O layout do sistema de arquivos e os utilitários do usuário (por exemplo, gerenciador de pacotes) são importantes.Use
/etc/os-release
:As razões são bem explicado em uma FAQ por um link http://0pointer.de/blog/projects/os-release.html gratuitamente fornecido pelo @weberjn em este comentário . Apenas listo aqui um argumento contra o uso da
lsb_release
que até agora é a resposta mais votada de 2013.fonte
/etc/os-release
isso se tornará mais padrão. No entanto, esse arquivo nem sempre existe em todos os sistemas, e é por isso que a resposta aceita oferece alternativas mais portáteis. Além disso, eu não sei por que você está mencionando o código C, a questão não é sobre como chamar qualquer coisa de C./etc/os-release
está ausente? Eu acho que sua base de usuários é miserável em comparação com sistemas ondelsb_release
não é enviado por padrão. Pelo menos eu não poderia usar sua resposta aceita no Fedora. Quanto ao comentário C, não é meu, mas uma citação dosystemd
link 0pointer.de que eu forneci.os-release
é principalmente ou exclusivamente uma coisa do Linux. Parece ser definido pelo FreeDesktop.org, então talvez alguns tipos de Unix também o usem, mas duvido que você o encontre na maioria ou em sistemas embarcados ou em qualquer sistema que não seja de GUI etc. Por fim, não esqueça que muitos lugares ainda use máquinas muito antigas por razões de estabilidade.lsb_release
e você pode substituir C por Go e obter o mesmo argumento. A sobrecarga da execuçãolsb_release
é muito maior nos pontos de segurança e desempenho do que apenas na análise de arquivos estáticos. Não acredito em máquinas muito antigas que proporcionam estabilidade. Heartbleed e amigos deveria ter tomado-los fora há muito tempo, então é só usar/etc/os-release