Come posso ottenere in modo affidabile il nome del sistema operativo?


69

Supponiamo che io abbia effettuato l'accesso a un sistema remoto, come posso sapere cosa sta funzionando? Sulla maggior parte dei Linux moderni (Linuces?), Hai il lsb_releasecomando:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Il che, per quanto ne so, dà solo le stesse informazioni di /etc/lsb-release. Cosa succede se quel file non è presente? Mi sembra di ricordare che il lsb_releasecomando è relativamente nuovo, quindi cosa succede se devo ottenere il sistema operativo di un sistema più vecchio?

In ogni caso, lsbsta per Linux Standard Basequindi suppongo che non funzionerà su Unices non Linux. Per quanto ne so, non c'è modo di ottenere queste informazioni da unamecosì come posso ottenere questo su sistemi che non utilizzano lsb_release?


1
unix.stackexchange.com/questions/6345/… per Linux. uname -sdovrebbe essere abbastanza al di fuori di Linux (aspettarsi possibilmente per i BSD).
Mat

Hai verificato facter? facter operatingsystemdovrebbe fare quello che vuoi su tutti i sistemi con cui è facterstato realizzato il lavoro.
Joseph R.,

@JosephR. sembra buono ma non è installato di default.
terdon

1
Ho incollato il factercodice che ottiene il nome del sistema operativo su pastebin. Lo trovi qui . Controlla molti file diversi per ottenere il nome in modo affidabile.
Joseph R.,

@JosephR. wow, ci sono molti file. Lo porterò a bash quando ne avrò la possibilità, dovrebbe essere abbastanza portatile. Grazie!
terdon

Risposte:


72

lsb_release -a sarà probabilmente l'opzione migliore per scoprire queste informazioni e riuscire a farlo in modo coerente.

Storia dell'LSB

Il lsbcomando in questo sta per il progetto Linux Standards Base, che è un progetto ombrello sponsorizzato dalla Linux Foundation per fornire metodi generici per fare cose di base su varie distribuzioni Linux.

Il progetto è volontario e i fornitori possono partecipare al progetto solo come utente e anche come facilitatori delle varie specifiche relative a diversi moduli che aiutano a guidare la standardizzazione all'interno delle diverse distribuzioni Linux.

estratto dalla carta

Il gruppo di lavoro LSB deve, come obiettivo principale, affrontare queste due preoccupazioni. Pubblichiamo uno standard che descrive il set minimo di API che una distribuzione deve supportare, in consultazione con i principali distributori. Forniamo inoltre test e strumenti che misurano il supporto per lo standard e consentono agli sviluppatori di applicazioni di scegliere come target l'insieme comune. Infine, attraverso il nostro lavoro di test, cerchiamo di prevenire inutili divergenze tra le distribuzioni.

Link utili relativi a LSB

critiche

Ci sono una serie di problemi con LSB che lo rendono problematico per distro come Debian. L'uso forzato di RPM è uno. Vedi l' articolo di Wikipedia per ulteriori informazioni sulla questione .

Novell

Se effettui una ricerca, ti imbatterai in una pagina dall'aspetto piuttosto datato intitolata: Detecting Sottostante Linux Distro di Novell. Questo è uno dei pochi posti in cui ho visto un elenco reale che mostra alcune delle principali distro e come è possibile rilevare quale sottostante si sta utilizzando.

estratto

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

Questa stessa pagina include anche un utile script che tenta di codificare quanto sopra usando solo unamecomandi vanilla e la presenza di uno dei file sopra.

NOTA: questo elenco è datato ma è possibile eliminare facilmente le distro datate come Mandrake dall'elenco e sostituirle con alternative. Questo tipo di script potrebbe essere un approccio se stai tentando di supportare una vasta gamma di varianti di Solaris e Linux.

Mafia Linux

Altre ricerche mostreranno la seguente pagina mantenuta su Linuxmafia.com, intitolata: / etc / release equivalents per varie distribuzioni Linux (e altre Unix) . Questa è probabilmente la lista più completa che abbia mai visto. È possibile codificare questo elenco con un'istruzione case / switch e includerlo come parte della distribuzione del software.

In effetti c'è uno script in fondo a quella pagina che fa esattamente questo. Quindi puoi semplicemente scaricare e utilizzare lo script come terza parte nella tua distribuzione software.

copione

#!/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: questo script dovrebbe apparire familiare, è una versione aggiornata di Novell!

Script per le gambe

Un altro metodo che ho visto impiegato è di girare il tuo script, simile al metodo Novell sopra ma facendo invece uso di LSB. Questo articolo intitolato: Metodo generico per determinare il nome di distribuzione Linux (o UNIX) , mostra uno di questi metodi.

# 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

Questo blocco di codice potrebbe essere incluso in un file di sistema /etc/bashrco in alcuni di questi file che quindi imposterebbe la variabile di ambiente $DISTRO.

gcc

Che ci crediate o no, è un altro metodo da utilizzare gcc. Se richiedi il comando gcc --versionotterrai la distro per cui è stato creato gcc, che è invariabilmente uguale al sistema su cui è in esecuzione.

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;

Quindi quale dovrei usare? Tenderei ad andare lsb_release -aper qualsiasi distribuzione Linux che frequenterei (RedHat, Debian, Ubuntu, ecc.). Per le situazioni in cui stai supportando i sistemi che non forniscono, lsb_releaseeseguirò il mio come parte della distribuzione del software che sto fornendo, simile a uno degli script sopra.

AGGIORNAMENTO N. 1: follow-up con SuSE

Parlando con @Nils nei commenti sottostanti, è stato stabilito che, per qualsiasi motivo, SLES11 sembrava non installare LSB per impostazione predefinita. Era solo un'installazione opzionale, che sembrava controproducente per un pacchetto che fornisce questo tipo di funzionalità chiave.

Quindi ho colto l'occasione per contattare qualcuno del progetto OpenSuSE per avere un'idea del perché.

estratto di 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

Ecco la risposta di 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 

1
Nota: ho appena fatto un rapido controllo su macchine con AIX e SunOS. Sembra che non abbiano installato lsb_release (e dopotutto, si tratta di uno stack Unix non Linux). Il problema con gcc è che alcuni ppl ora iniziano a usare clang. Inoltre non puoi mai essere sicuro di quale gcc è stato usato per compilare (sui sistemi con cui lavoro ci sono almeno alcune versioni su ciascuno). Quindi il mio voto va alla soluzione Python in quanto sembra essere installato ora dappertutto per impostazione predefinita.
elmo

@elmo - sì LSB è Linux Standard Base, quindi non mi aspetto che AIX o SunOS lo abbiano. La mia esperienza con SunOS è di oltre 15 anni e la maggior parte dei fornitori il cui software con cui ho avuto a che fare solitamente forniva un proprio script di shell simile a quelli a cui ho fatto riferimento in precedenza. Fino a Solaris 11, Python non era un'opzione. E questo è ciò che lo rende difficile da decifrare. Se fornite software che deve essere eseguito su Solaris 9, 10, 11, AIX e un paio di distro Linux (SUSE, Ubntu e RHEL), cosa fate? Python non è un'opzione, quindi ti rimane uno script shell codificato a mano.
slm

@elmo - gcc, comunque, un'opzione, non sembra essere così attraente neanche per me. Sembra complicato da troppi problemi, lo stavo dimostrando semplicemente come un'opzione.
slm

@elmo - guarda il codice dietro quella funzione, hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Grande sorpresa sta usando LSB!
slm

@slm: ho accesso alla macchina con SunOS 5.10 (che presumo sia 10 nella tua lista - non ho familiarità con i numeri di versione / convenzioni di Sun) e ha un Python. Ho accesso alla macchina con AIX 7 e ha Python. Ovviamente anche le macchine Linux ce l'hanno. Quindi Python sembra la scelta più portatile. Per quanto riguarda Sun inferiore a 10, non sono sicuro del motivo per cui non consentirebbe l'installazione di Python (è vero che l'installazione attuale è carente, ad esempio ncurses e ctypes, quindi chi lo sa). Per quanto riguarda Python che usa LSB, non è affatto sorprendente per Linux se si tratta di un approccio predefinito.
elmo,

16

Dato che probabilmente non sarai in grado di installare factersu un server remoto, puoi imitare ciò che fa per trovare il nome del sistema operativo. Il codice Ruby per il operatingsystemfatto può essere trovato qui su pastebin . Fondamentalmente, cerca tra i diversi *-releasefile e altri per determinare il nome del sistema operativo.

Alcuni dei file che guarda:

/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

Mi dispiace se trovi duplicati in questo elenco, l'ho prodotto rapidamente con grep. Dovrebbe essere abbastanza facile (anche se un po 'noioso) portarlo su uno script di shell POSIX.


5
"Mi dispiace se trovi duplicati in questo elenco, l'ho prodotto rapidamente con grep." ... | uniq?
nuovo123456

@ new123456 Giusto. Grazie. La parola chiave qui è "rapidamente" :)
Joseph R.

Mi dispiace non accettarlo, ma la risposta di @ slm è troppo completa per essere ignorata :).
Terdon

3
che dire di / etc / os-release?
Yauhen Yakimovich,

1
@ new123456 Tecnicamente, dovrebbe essere ... | sort -u. uniqtrova solo elementi unici adiacenti.
Parthian Shot

9

Se hai pythoninstallato (non importa se Python 3 o Python 2), puoi scoprire il nome della distribuzione senza reinventare la ruota :

python -c "import platform;print(platform.linux_distribution()[0])"

Se sei tentato di utilizzare questa opzione, assicurati che il tuo sistema operativo sia supportato: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Altrimenti puoi aggiungere altro all'elenco: coderwall.com/p/cwrenq
slm

1
Questo non funzionerà con le antiche distribuzioni Linux. Ad esempio: SuSE 7.0 aveva Python 1.5.2 e il modulo della piattaforma è stato aggiunto non prima dell'avvento di Python 2.3 nel 2003 ;-)
pefu

6

/etc/issuedovrebbe contenere le informazioni sulla versione. Sono abbastanza sicuro di averlo visto sui sistemi Solaris. Ecco il file da un moderno sistema Debian:

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

$ 

Il problema / etc / è anche menzionato nell'FHS (che non è solo per i sistemi Linux), sebbene sia "facoltativo".


Ah, questo è un buon suggerimento, +1. Potrebbe non funzionare sempre, anche se The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.sembra che sia il sysadmin a scrivere tutto ciò che desidera.
Terdon

2
/etc/issueè completamente inaffidabile. (Ho visto i sistemi nella versione XY con un /etc/issuebanner che diceva che erano YZ a seguito di una cattiva gestione delle patch. Può contenere assolutamente qualsiasi cosa.)
Mat

Si consiglia di riempire quel file con. cose legali come chi è autorizzato ad accedere.
Nils,

Consigliato da linee guida e revisori della sicurezza. C'era una volta un caso legale in cui un hacker veniva via senza punizione, perché c'era il BENVENUTO in / etc / issue
Nils

@drewbenn la pagina man dice quello che ho citato nel mio primo commento, non c'è nulla lì sulla sua necessità di contenere le informazioni di sistema. Lo fa spesso.
terdon

6

Non è possibile ottenere in modo affidabile il nome della distro da un singolo comando in tutte le distro. Alcuni sono disponibili tramite / etc / * - release e altri sono disponibili tramite il comando 'lsb-release'.


Grazie, ma nemmeno un aiuto quando si tratta di Unix o di qualsiasi altro non-Linux * nix.
terdon

3

Ho usato questo comando shell per ottenere una stringa che indica la distribuzione 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;

questo comando si basa sulle risposte di Joseph R. e slm.

Cerca solo file come / etc / {osname} -release o / etc / {osname} _version e stampa un particolare nome del sistema operativo.

Ha funzionato

  • CentOS (centos)
  • RedHat (redhat)
  • Debian (debian)
  • Arch (arch)
  • OpenSUSE (OpenSUSE)
  • Fedora (fedora)
  • Ubuntu (debian)

Non for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; donefunzionerebbe altrettanto bene su tutti loro? Non capisco perché prima dovresti inserire findtutti i file /etc.
terdon

Grazie per il tuo feedback, terdon, ma il tuo comando dà 0 righe in almeno Cent OS e Fedora
scrutari


1

SNMP è un protocollo abbastanza onnipresente da trovare in molti diversi tipi di distribuzioni GNU / Linux e sistemi UNIX.

L' system.sysDescr.0oggetto in SNMPv2-MIB può aiutarti a scoprire quale sistema operativo stai contattando, a condizione che ci sia un demone SNMP in esecuzione nel sistema di destinazione:

Descrizione

Una descrizione testuale dell'entità. Questo valore dovrebbe includere il nome completo e l'identificazione della versione del tipo di hardware del sistema, del sistema operativo del software e del software di rete.

Stato: attuale

Accesso: sola lettura

La snmpget(1)manpage spiega come recuperare questo valore con esempi.


Lo svantaggio è che si tratta di una stringa statica che non viene gestita automaticamente.
Nils,

1

Poiché non esiste un modo comune per farlo, abbiamo definito una stringa di rilascio tramite il comando exec snmp.

Il compito di quel comando è stampare la distro e l'attuale versione maggiore / minore del sistema operativo.

Su RH e cloni analizziamo / etc / redhat-release, su SuSe SuSe-release ...


Chi è "noi"? E che dire di Unix?
terdon

@terdon siamo il nostro team al lavoro. Su Unix puoi fare lo stesso se l'estensione corrispondente è compilata in snmpd.
Nils,

Ah, pensavo fossi parte di un gruppo di standard :)
terdon

@terdon Inizi a sviluppare standard di sito quando devi gestire più di 80 server. Abbiamo sviluppato questo metodo in modo da poter monitorare se il sistema operativo è obsoleto (numero minore di EoL o addirittura maggiore)
Nils

1

Da quello che sono riuscito a trarre da questo thread dovresti essere in grado di ottenere le informazioni da maledettamente vicino a qualsiasi sistema utilizzando:

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

2
non analizzare l'output di ls!
heinrich5991

@ heinrich5991 perché no?
Sammitch,

Tecnicamente, non sta analizzando l'output di ls. Sta lasciando libero il risultato di ls. Ma sì ... Questo è sbagliato perché /etc/issueè completamente inaffidabile. Completamente, totalmente, totalmente inaffidabile. Inoltre, la tua ipotesi che nessuno possa mettere un file non correlato al sistema operativo che termina con "release" o "version" non è saggia.
Parthian Shot

@ParthianShot Quindi principalmente vuoi lamentarti del secondo e terzo livello di fallback nel caso in cui le opzioni più affidabili non siano disponibili?
Sammitch,

@Sammitch more reliable optionsBene, per prima cosa, c'è solo un'opzione. Quindi anche supponendo che io abbia concordato con la tua ipotesi che sia più affidabile (cosa che non faccio), non iniziamo a pluralizzare le cose. In secondo luogo, se qualcuno avesse effettivamente utilizzato la tua soluzione, e completamente fallita per metà del tempo, non sarebbe stato consolato dal fatto che stava fallendo in un "altro se". Nessuno dei miei sistemi è lsbinstallato per impostazione predefinita.
Colpo di Parthian del

1

Se una situazione lo richiedesse, potresti scoprirlo da remoto usando snmpwalk [o il protocollo SNMP in generale]. Un esempio è di seguito:

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

OUPUT: sysDescr.0 = STRING: Linux esempio.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP sab 14 set 05:32:37 EDT 2013 x86_64

La chiave per l'affidabilità è se SNMP è configurato correttamente nel tuo ambiente, tutti gli host hanno snmp in esecuzione con una corretta configurazione delle stringhe di comunità.


Cosa snpwalk? Dove posso trovarlo? Inoltre, che si limita a stampare "Linux", nessuna informazione di distribuzione (che è quello che voglio, unamemi può dare Linux). Funziona su sistemi operativi non Linux? Su UNIX dire, o BSD o OSX?
terdon

snmpwalk è un'utilità della riga di comando di Linux. Non solo stampa "Linux" ma stampa anche la versione del kernel che è davvero l'unica cosa di cui hai bisogno. Se SNMP è configurato su altri host, indipendentemente dal fatto che sia UNIX, BSD, OSX, snmpwalk funzionerà in quanto standard (v1 | v2c | v3) e funzionerà anche sull'acqua su host Windows. Vedi anche snmpget o snmpgetnext.
xpros,

Suona bene, ma potresti modificare la tua risposta e spiegare dove possiamo trovarla. Ad esempio, non è nel repository Debian. Inoltre, ti prego di spiegare cosa non dà uname -ae come può dirmi il nome della distribuzione, di cui tratta questa domanda. Comunque, anche supponendo che possa restituire queste informazioni, visto che si tratta di un'utilità non standard e deve essere installata, non sono sicuro che sarebbe utile qui. L'idea è di accedere a un sistema remoto e scoprire il sistema operativo (inclusa la distribuzione se è Linux).
terdon

it also prints the kernel version which is really the only thing you needMa ... questo è il punto centrale di questa domanda. Se fosse davvero tutto ciò di cui hai bisogno, potresti semplicemente usare uname -a. Il kernel è una parte importante di un sistema operativo, ma non è l'intero sistema operativo. Il layout del filesystem e le utilità per l'utente (ad es. Gestore di pacchetti) sono importanti.
Parthian Shot

1

Utilizzare /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

Le ragioni sono ben spiegate in una FAQ da un link http://0pointer.de/blog/projects/os-release.html fornito gratuitamente da @weberjn in questo commento . Ho appena elencato qui un argomento contro l'utilizzo della lsb_releasequale è finora la risposta più votata dal 2013.

C'è già lo strumento lsb_release per questo, perché non lo usi?Bene, è un'interfaccia molto strana: uno script di shell che devi invocare (e quindi spawnare in modo asincrono dal tuo codice C), e non è scritto per essere estensibile. È un pacchetto opzionale in molte distribuzioni e nulla di cui saremmo felici di invocare durante l'avvio anticipato per mostrare un messaggio di benvenuto. (A volte con tempi di avvio inferiori allo spazio utente non vogliamo davvero invocare un enorme script shell per una banalità come mostrare il messaggio di benvenuto). Lo strumento lsb_release per noi sembra essere un tentativo di astrarre i controlli di distribuzione, dove è necessaria la standardizzazione dei controlli di distribuzione. È semplicemente un'interfaccia mal progettata. A nostro avviso, ha il suo uso come interfaccia per determinare la versione LSB stessa, ma non per controllare la distribuzione o la versione.


Grazie, ma la risposta accettata risolve già questo problema nel preventivo alla fine, il che spiega che /etc/os-releasediventerà più standard. Tuttavia, quel file non è sempre presente su tutti i sistemi, motivo per cui la risposta accettata offre alternative più portatili. Inoltre, non so perché stai citando il codice C, la domanda non è di invocare nulla da C.
terdon

@terdon Sono solo curioso di sapere quali sono quei sistemi nel 2018 dove /etc/os-releaseè assente? Immagino che la loro base di utenti sia miserabile rispetto ai sistemi in cui lsb_releasenon viene fornita per impostazione predefinita. Almeno non ho potuto usare la tua risposta accettata su Fedora. Per quanto riguarda il commento C, non è mio, ma una citazione dal systemdlink 0pointer.de che ho fornito.
Anatoly Techtonik,

Sì, lo so che non è tuo, mi stavo solo chiedendo perché pensavi che una citazione sul codice C fosse pertinente. E per quanto ne so, os-releaseè principalmente o esclusivamente una cosa Linux. Sembra essere definito da FreeDesktop.org, quindi forse anche alcune versioni di Unix lo usano, ma dubito che lo troverai nella maggior parte o in sistemi embedded o in qualsiasi sistema non-GUI ecc. Infine, non dimenticare che molti posti uso ancora macchine molto vecchie per motivi di stabilità.
terdon

La citazione è circa lsb_releasee puoi sostituire C con Go e ottenere lo stesso argomento. Il sovraccarico della corsa lsb_releaseè molto più elevato sia dal punto di vista della sicurezza che delle prestazioni rispetto al semplice analisi del file statico. Non credo nelle macchine molto vecchie che forniscono stabilità. Heartbleed and friends avrebbe dovuto portarli via molto tempo fa, quindi basta usare/etc/os-release
anatoly techtonik
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.