GNU/Linux >> Linux Esercitazione >  >> Linux

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

lsb_release -a è probabilmente la tua migliore opzione per trovare queste informazioni ed essere in grado di farlo in modo coerente.

Storia di LSB

Il lsb in quel comando 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 utenti 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 ha come obiettivo principale quello di affrontare queste due preoccupazioni. Pubblichiamo uno standard che descrive il set minimo di API che una distribuzione deve supportare, in consultazione con i principali fornitori di distribuzione. Forniamo anche test e strumenti che misurano il supporto per lo standard e consentono agli sviluppatori di applicazioni di scegliere come target il set comune. Infine, attraverso il nostro lavoro di test, cerchiamo di prevenire inutili divergenze tra le distribuzioni.

Link utili relativi a LSB

  • Carta LSB
  • Gruppo di lavoro LSB
  • Tabella di marcia LSB
  • Mailing List LSB (l'attività corrente è qui!)
  • Elenco dei prodotti LSB certificati
  • Pagina LSB Wikipedia

Critiche

Ci sono una serie di problemi con LSB che lo rendono problematico per distribuzioni come Debian. L'uso forzato di RPM è uno. Consulta l'articolo di Wikipedia per ulteriori informazioni sull'argomento.

Novell

Se esegui una ricerca, probabilmente ti imbatterai in una pagina dall'aspetto piuttosto datato intitolata:Rilevamento della distribuzione Linux sottostante da Novell. Questo è uno dei pochi posti in cui ho visto un elenco effettivo che mostra molte delle principali distribuzioni e come puoi rilevare quale di base stai 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 pratico script che tenta di codificare quanto sopra usando solo vanilla uname comandi e la presenza di uno dei file di cui sopra.

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

Linux Mafia

Ulteriori ricerche mostreranno la seguente pagina mantenuta su Linuxmafia.com, intitolata:/etc/release equivalenti per varie distribuzioni Linux (e altre Unix). Questo è probabilmente l'elenco più completo fino ad oggi che ho visto. Potresti codificare questo elenco con un'istruzione case/switch e includerlo come parte della tua distribuzione 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 per la 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 sembrare familiare, è una versione aggiornata di quello Novell!

Sceneggiatura con spazio per le gambe

Un altro metodo che ho visto impiegato è quello di lanciare il tuo script, simile al metodo Novell precedente ma utilizzando invece LSB. Questo articolo intitolato:Metodo generico per determinare il nome della 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 pezzo di codice potrebbe essere incluso nel /etc/bashrc di un sistema o qualche file simile che imposterebbe la variabile d'ambiente $DISTRO .

gcc

Che tu ci creda o no, un altro metodo è utilizzare gcc . Se interroghi il comando gcc --version otterrai la distribuzione 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 con lsb_release -a per tutte le distribuzioni Linux che frequenterei (RedHat, Debian, Ubuntu, ecc.). Per situazioni in cui stai supportando sistemi che non forniscono lsb_release Lancerei il mio come parte della distribuzione del software che sto fornendo, simile a uno degli script di cui sopra.

AGGIORNAMENTO N. 1:follow-up con SuSE

Parlando con @Nils nei commenti sottostanti è stato stabilito che, per qualsiasi motivo, SLES11 sembrava eliminare LSB dall'installazione predefinita. Era solo un'installazione facoltativa, che sembrava in contrasto con un pacchetto che fornisce questo tipo di funzionalità chiave.

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

estratto dell'email

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 

Dal momento che probabilmente non sarai in grado di installare facter su un server remoto, puoi imitare ciò che fa per trovare il nome del sistema operativo. Il codice Ruby per il operatingsystem il fatto può essere trovato qui su pastebin. Fondamentalmente, esamina i diversi *-release file e altri per determinare il nome del sistema operativo.

Alcuni dei file esaminati:

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


Nel caso tu abbia python installato (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])"

Linux
  1. Linux:come ottenere in modo affidabile il nome del sistema operativo?

  2. Come posso ottenere lo stato della tastiera in Linux?

  3. Come posso ottenere la cartella temporanea di una macchina che esegue Maven?

  4. Come ottenere il sistema operativo corrente in MSBuild?

  5. Come posso modificare l'ora prima che il sistema si blocchi?

Come ottenere la dimensione di una directory in Linux

Come recuperare la notifica Skype nella barra delle applicazioni?

Dove posso trovare la prima versione del sistema operativo Linux?

Come ottenere informazioni sul sistema operativo dell'istanza Amazon EC2?

Come posso ottenere la lunghezza di un file video dalla console?

Se conosco il numero PID di un processo, come posso ottenere il suo nome?