Como posso obter o nome do sistema operacional de maneira confiável?

69

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_releasecomando:

$ 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_releasecomando é relativamente novo. E se eu precisar obter o sistema operacional de um sistema mais antigo?

De qualquer forma, lsbsignifica Linux Standard Baseque 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, unameentão como posso obtê-las em sistemas que não usam lsb_release?

terdon
fonte
11
unix.stackexchange.com/questions/6345/… para Linux. uname -sdeve ser suficiente fora do Linux (espere possivelmente pelos BSDs).
Tapete de
Você fez check-out facter? facter operatingsystemvocê deve fazer o que deseja em todos os sistemas facterpara que funcione.
Joseph R.
@JosephR. parece bom, mas não está instalado por padrão.
terdon
11
Colei o factercó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.
Joseph R.
@JosephR. uau, são muitos arquivos. Vou portar isso para bater quando tiver a chance, que deve ser portátil o suficiente. Obrigado!
terdon

Respostas:

72

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 lsbcomando 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

O grupo de trabalho da LSB tem como objetivo principal abordar essas duas preocupações. Publicamos um padrão que descreve o conjunto mínimo de APIs que uma distribuição deve suportar, em consulta com os principais fornecedores de distribuição. Também fornecemos testes e ferramentas que medem o suporte ao padrão e permitem que os desenvolvedores de aplicativos direcionem o conjunto comum. Finalmente, através de nosso trabalho de teste, procuramos evitar divergências desnecessárias entre as distribuições.

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

Novell SUSE         /etc/SUSE-release
Red Hat             /etc/redhat-release, /etc/redhat_version
Fedora              /etc/fedora-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
UnitedLinux         /etc/UnitedLinux-release
ubuntu              /etc/lsb-release

Essa mesma página também inclui um script útil que tenta codificar o que foi descrito acima usando apenas unamecomandos 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

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

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.

# Determine OS platform
UNAME=$(uname | tr "[:upper:]" "[:lower:]")
# If Linux, try to determine specific distribution
if [ "$UNAME" == "linux" ]; then
    # If available, use LSB to identify distribution
    if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
        export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
    # Otherwise, use release info file
    else
        export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
    fi
fi
# For everything else (or if above failed), just use generic identifier
[ "$DISTRO" == "" ] && export DISTRO=$UNAME
unset UNAME

Esse pedaço de código pode ser incluído no /etc/bashrcarquivo 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 --versionobterá a distribuição para a qual o gcc foi criado, que é invariavelmente igual ao sistema em que está sendo executado.

Fedora 14

$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.

CentOS 5.x

$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.

CentOS 6.x

$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.

Ubuntu 12.04

$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.

TL; DR;

Então, qual devo usar? Eu costumava usar lsb_release -atodas 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_releaseeu 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

Hi Rob,

I hope you don't mind me contacting you directly but I found your info here: 
https://en.opensuse.org/User:Rjschwei. I participate on one of the StackExchange 
sites, Unix & Linux and a question recently came up regarding the best option 
for determining the underlying OS.

http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name/92218?noredirect=1#comment140840_92218

In my answer I suggested using lsb_release, but one of the other users mentioned 
that this command wasn't installed as part of SLES11 which kind of surprised me. 
Anyway we were looking for some way to confirm whether this was intentionally 
dropped from SLES or it was accidental.

Would you know how we could go about confirming this one way or another?

Thanks for reading this, appreciate any help and/or guidance on this.

-Sam Mingolelli
http://unix.stackexchange.com/users/7453/slm

Aqui está a resposta de Rob

Hi,

On 10/01/2013 09:31 AM, Sam Mingo wrote:
- show quoted text -

lsb_release was not dropped in SLES 11. SLES 11 is LSB certified. However, it 
is not installed by default, which is consistent with pretty much every other
distribution. The lsb_release command is part of the lsb-release package.

At present almost every distribution has an entry in /etc such as 
/etc/SuSE-release for SLES and openSUSE. Since this is difficult for ISVs and 
others there is a standardization effort going on driven by the convergence to 
systemd. The standard location for distribution information in the future will 
be /etc/os-release, although Ubuntu will probably do something different.

HTH,    
Robert

--  Robert Schweikert                           MAY THE SOURCE BE WITH YOU    
SUSE-IBM Software Integration Center                   LINUX    
Tech Lead    
Public Cloud Architect 
slm
fonte
11
Nota: Acabei de verificar rapidamente as máquinas com AIX e SunOS. Eles não parecem ter o lsb_release instalado (e, afinal, esse é o Unix, não a pilha do Linux). O problema com o gcc é que algumas pessoas agora começam a usar o clang. Além disso, você nunca pode ter certeza de qual gcc foi usado para criar (nos sistemas com os quais trabalho existem pelo menos poucas versões em cada uma). Então, meu voto foi para a solução Python, pois parece estar instalada agora em todos os lugares por padrão.
Elmo
@elmo - sim, o LSB é o Linux Standard Base, então eu não esperaria que o AIX ou o SunOS o tivessem. Minha experiência com o SunOS tem mais de 15 anos, e a maioria dos fornecedores cujo software eu lidei geralmente forneceria um script de shell semelhante aos mencionados acima. Até o Solaris 11, o Python não era uma opção. E é isso que torna uma noz difícil de quebrar. Se você fornece um software que precisa ser executado no Solaris 9, 10, 11, AIX e algumas distribuições do Linux (SUSE, Ubntu e RHEL), o que você faz? Python não é uma opção, então você fica com um script de shell codificado manualmente.
slm
@elmo - gcc, porém, uma opção, não parece ser tão atraente para mim também. Parece forjado com muitos problemas, eu estava demonstrando isso apenas como uma opção.
slm
@elmo - veja o código por trás dessa função, hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Grande surpresa está usando LSB!
slm
@ slm: Eu tenho acesso à máquina com o SunOS 5.10 (que eu assumo é 10 na sua lista - eu não estou familiarizado com os números de versão / convenções da Sun) e ele possui um Python. Eu tenho acesso à máquina com o AIX 7 e ele possui Python. Máquinas Linux obviamente também o têm. Portanto, o Python ainda parece a escolha mais portátil. Quanto ao Sun abaixo de 10, não sei por que ele não permitiria a instalação do Python (a instalação atual está ausente, ou seja, ncurses e ctypes, então quem sabe). Quanto ao Python usando LSB, não é surpreendente para o Linux se for uma abordagem padrão.
elmo
16

Como você provavelmente não poderá instalar facterem um servidor remoto, imite o que ele faz para encontrar o nome do sistema operacional. O código Ruby para o operatingsystemfato pode ser encontrado aqui em pastebin . Basicamente, ele examina os diferentes *-releasearquivos e outros para determinar o nome do sistema operacional.

Alguns dos arquivos analisados:

/etc/debian_version
/etc/gentoo-release
/etc/fedora-release
/etc/mandriva-release
/etc/mandrake-release
/etc/meego-release
/etc/arch-release
/etc/oracle-release
/etc/enterprise-release
/etc/ovs-release
/etc/vmware-release
/etc/redhat-release
/etc/SuSE-release
/etc/bluewhite64-version
/etc/slamd64-version
/etc/slackware-version
/etc/alpine-release
/etc/system-release
/etc/centos-release

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.

Joseph R.
fonte
5
"Me desculpe se você encontrar duplicatas nesta lista, eu a produzi rapidamente com grep." ... | uniq?
new123456
@ new123456 Certo. Obrigado. A palavra chave aqui é "rapidamente" :)
Joseph R.
Desculpe por não aceitar isso, mas a resposta da @ slm é muito abrangente para ignorar :).
terdon
3
e quanto ao / etc / os-release?
Yauhen Yakimovich
11
@ new123456 Tecnicamente, deveria ser ... | sort -u. uniqsó encontra elementos exclusivos adjacentes.
Parthian Shot
9

Caso você tenha pythoninstalado (não importa se Python 3 ou Python 2), você pode descobrir o nome da distribuição sem reinventar a roda :

python -c "import platform;print(platform.linux_distribution()[0])"
heinrich5991
fonte
Se você estiver tentado a usar esta opção, verifique se o seu sistema operacional é suportado: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Caso contrário, você pode adicionar mais à lista: coderwall.com/p/cwrenq
slm
11
Isso não funcionará com distribuições antigas do Linux. Por exemplo: SuSE 7.0 teve Python 1.5.2 eo módulo de plataforma foi adicionado não antes do advento do Python 2.3 em 2003 ;-)
pefu
6

/etc/issuedeve 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:

$ cat /etc/issue
Debian GNU/Linux 7 \n \l

$ 

/ etc / issue também é mencionado no FHS (que não é apenas para sistemas Linux), embora seja "opcional".

Drewbenn
fonte
Ah, essa é uma boa sugestão, +1. Embora nem sempre funcione 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.
terdon
2
/etc/issueé completamente não confiável. (Eu tenho ver sistemas em versão XY com uma /etc/issuebandeira que diz que eles foram YZ seguinte gerenciamento de patches mau Ele pode conter absolutamente nada..)
Mat
É recomendável preencher esse arquivo com. coisas legais como quem tem permissão para entrar.
Nils
Recomendado por diretrizes de segurança e auditores. Era uma vez um caso com a lei, onde um hacker saiu sem punição, porque não era bem-vindo em / etc / issue
Nils
@drewbenn A página de manual diz o que eu citei no meu primeiro comentário, não há nada sobre a necessidade de conter as informações do sistema. Isso geralmente acontece.
terdon
6

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'.

boz
fonte
Obrigado, mas também não é uma ajuda quando se trata de Unix ou qualquer outro não-Linux * nix.
terdon
3

Eu usei este comando shell para obter uma string indicando a distribuição Linux:

for f in $(find /etc -type f -maxdepth 1 \( ! -wholename /etc/os-release ! -wholename /etc/lsb-release -wholename /etc/\*release -o -wholename /etc/\*version \) 2> /dev/null); do echo ${f:5:${#f}-13}; done;

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

  • CentOS (centos)
  • RedHat (redhat)
  • Debian (debian)
  • Arco (arco)
  • OpenSUSE (OpenSUSE)
  • Fedora (fedora)
  • Ubuntu (debian)
scrutari
fonte
Não for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; donefuncionaria igualmente bem em todos eles? Não entendo por que você primeiro findregistraria todos os arquivos /etc.
terdon
Obrigado por seu feedback, terdon, mas seu comando fornece 0 linhas em pelo menos OS Cent e Fedora
Scrutari
1

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.0objeto 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:

Descrição

Uma descrição textual da entidade. Esse valor deve incluir o nome completo e a identificação da versão do tipo de hardware do sistema, sistema operacional do software e software de rede.

Status: atual

Acesso: somente leitura

A página de snmpget(1)manual explica como recuperar esse valor com exemplos.

dawud
fonte
A desvantagem é que essa é uma sequência estática que não é mantida automaticamente.
Nils
1

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 ...

Nils
fonte
Quem somos 'nós'? E o Unix?
terdon
@terdon, somos a nossa equipe no trabalho. No Unix, você pode fazer o mesmo se a extensão correspondente for compilada no snmpd.
Nils
Ah, eu pensei que você fosse uma parte de algum grupo de padrões :)
terdon
@terdon Você começa a desenvolver padrões de site quando precisa gerenciar mais de 80 servidores. Nós desenvolvemos este método para que pudéssemos monitorar wether o sistema operacional está desatualizado (EOL menor ou mesmo grande número)
Nils
1

Pelo que consegui recolher a partir desta discussão, você deve conseguir obter informações de qualquer sistema usando:

if which lsb_release &>> /dev/null; then
    lsb_release -a
elif [ -r /etc/issue ]; then
    cat /etc/issue
else
    ls /etc/ | grep -e '[_-]release$' -e '[_-]version$' | xargs -I % -n 1 cat /etc/%
fi
Sammitch
fonte
2
não analise a saída de ls!
heinrich5991
@ heinrich5991 porque não?
Sammitch 24/09/2013
Tecnicamente, ele não está analisando a saída de ls. Ele está lexing a saída de ls. 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.
Parthian Shot
@ParthianShot Então, principalmente, você quer reclamar dos segundo e terceiro níveis de fallback, caso as opções mais confiáveis não estejam disponíveis?
Sammitch
@ Sammitch more reliable optionsBem, 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 foi lsbinstalado por padrão.
Parthian Shot
1

Se uma situação exigir, você poderá descobrir remotamente usando o snmpwalk [ou o SNMP protocal em geral]. Um exemplo está abaixo:

snmpwalk -Os -c <snmp community string> -v1 <hostname> sysDescr.0

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.

xpros
fonte
O que é snpwalk? Onde posso encontrá-lo? Além disso, isso apenas imprime "Linux", nenhuma informação de distribuição (que é o que eu quero, unamepode me dar Linux). Funciona em sistemas operacionais não Linux? No UNIX digamos, ou BSD ou OSX?
terdon
snmpwalk é um utilitário de linha de comando do Linux. Ele não apenas imprime "Linux", mas também imprime a versão do kernel, que é realmente a única coisa que você precisa. Se o SNMP estiver configurado em seus outros hosts, seja UNIX, BSD, OSX, o snmpwalk funcionará como padrão (v1 | v2c | v3) e também funcionará através da água nos hosts Windows. Veja também snmpget ou snmpgetnext.
Xpros
Parece bom, mas você poderia editar sua resposta e explicar onde podemos encontrá-la. Não é o que o Debian repõe por exemplo. Além disso, por favor, explique o que dá e o que uname -anã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).
terdon
it also prints the kernel version which is really the only thing you needMas ... esse é o ponto principal desta questão. Se isso era realmente tudo o que você precisava, você poderia apenas usar uname -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.
Parthian Shot
1

Use /etc/os-release:

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.10 (Cosmic Cuttlefish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.10"
VERSION_ID="18.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=cosmic
UBUNTU_CODENAME=cosmic

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_releaseque até agora é a resposta mais votada de 2013.

Já existe a ferramenta lsb_release para isso, por que você não usa isso?Bem, é uma interface muito estranha: um script de shell que você precisa chamar (e, portanto, é gerado de forma assíncrona a partir do seu código C), e não está escrito para ser extensível. É um pacote opcional em muitas distribuições, e nada gostaríamos de chamar como parte da inicialização antecipada para mostrar uma mensagem de boas-vindas. (Em momentos com tempos de inicialização de espaço de usuário de menos de um segundo, realmente não queremos chamar um script shell enorme para uma trivialidade, como mostrar a mensagem de boas-vindas). A ferramenta lsb_release para nós parece ser uma tentativa de abstrair as verificações de distribuição, onde a padronização das verificações de distribuição é necessária. É simplesmente uma interface mal projetada. Em nossa opinião, ele tem seu uso como uma interface para determinar a própria versão do LSB, mas não para verificar a distribuição ou versão.

anatoly techtonik
fonte
Obrigado, mas a resposta aceita já aborda isso na citação no final, que explica que /etc/os-releaseisso 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.
terdon
@terdon Estou curioso em saber quais são esses sistemas em 2018 onde /etc/os-releaseestá ausente? Eu acho que sua base de usuários é miserável em comparação com sistemas onde lsb_releasenã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 do systemdlink 0pointer.de que eu forneci.
Anatoly techtonik
Sim, eu sei que não é seu. Fiquei me perguntando por que você achou que uma citação sobre o código C era relevante. E, tanto quanto eu sei, 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.
terdon
A citação é sobre lsb_releasee você pode substituir C por Go e obter o mesmo argumento. A sobrecarga da execução lsb_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
anatoly techtonik