GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu spolehlivě získat název operačního systému?

lsb_release -a Pravděpodobně bude vaší nejlepší možností, jak tyto informace zjistit a být schopni tak učinit konzistentním způsobem.

Historie LSB

lsb v tomto příkazu znamená projekt Linux Standards Base, což je zastřešující projekt sponzorovaný Linux Foundation, který poskytuje obecné metody pro provádění základních druhů věcí v různých distribucích Linuxu.

Projekt je dobrovolný a prodejci se mohou do projektu zapojit jako pouhý uživatel a také jako zprostředkovatel různých specifikací různých modulů, které pomáhají podporovat standardizaci v rámci různých distribucí Linuxu.

výňatek ze zakládací listiny

Hlavním cílem pracovní skupiny LSB je řešit tyto dva problémy. Po konzultaci s hlavními distributory zveřejňujeme standard, který popisuje minimální sadu distribuce APIsa, kterou musí podporovat. Poskytujeme také testy a nástroje, které měří podporu standardu a umožňují vývojářům aplikací zaměřit se na společnou sadu. A konečně, prostřednictvím naší testovací práce se snažíme zabránit zbytečným rozdílům mezi distribucemi.

Užitečné odkazy související s LSB

  • Charta LSB
  • LSB Workgroup
  • Plán LSB
  • Seznam adresátů LSB (aktuální aktivita je zde!)
  • Seznam certifikovaných produktů LSB
  • Stránka LSB Wikipedia

Kritika

Existuje řada problémů s LSB, které jej činí problematickým pro distribuce, jako je Debian. Nucené použití RPM je jedna. Více o této záležitosti naleznete v článku na Wikipedii.

Novell

Pokud budete hledat, možná narazíte na poměrně zastaralou stránku s názvem:Detecting Underlying Linux Distro od Novellu. Toto je jedno z mála míst, kde jsem viděl skutečný seznam, který ukazuje několik hlavních distribucí a jak můžete zjistit, kterou základní používáte.

úryvek

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

Stejná stránka také obsahuje praktický skript, který se pokouší kodifikovat výše uvedené pomocí pouze vanilky uname příkazy a přítomnost jednoho z výše uvedených souborů.

POZNÁMKA: Tento seznam je zastaralý, ale můžete snadno vypustit zastaralá distribuce, jako je Mandrake, ze seznamu a nahradit je alternativami. Tento typ skriptu může být jedním z přístupů, pokud se pokoušíte podporovat velké množství variant Solaris a Linux.

Linuxová mafie

Při dalším hledání se objeví následující stránka udržovaná na Linuxmafia.com s názvem:/etc/release ekvivalenty pro různé distribuce Linuxu (a další unixové). Toto je pravděpodobně dosud nejvyčerpávající seznam, jaký jsem kdy viděl. Tento seznam můžete kodifikovat pomocí příkazu case/switch a zahrnout jej jako součást distribuce softwaru.

Ve skutečnosti je ve spodní části stránky skript, který přesně to dělá. Skript si tedy můžete jednoduše stáhnout a použít jako třetí strana vaší distribuce softwaru.

skript

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

POZNÁMKA: Tento skript by měl vypadat povědomě, je to aktuální verze skriptu Novell!

Legroom skript

Další metodou, kterou jsem viděl, je použít svůj vlastní skript, podobný výše uvedené metodě Novell, ale místo toho využívá LSB. Tento článek s názvem:Obecná metoda k určení názvu distribuce systému Linux (nebo UNIX) ukazuje jednu takovou metodu.

# 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

Tento kus kódu by mohl být zahrnut do systémového /etc/bashrc nebo nějaký takový soubor, který by pak nastavil proměnnou prostředí $DISTRO .

gcc

Věřte tomu nebo ne, jinou metodou je použití gcc . Pokud zadáte dotaz na příkaz gcc --version získáte distribuci, pro kterou byl vytvořen gcc, která je vždy stejná jako systém, na kterém běží.

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;

Který mám tedy použít? Měl bych tendenci jít s lsb_release -a pro všechny distribuce Linuxu, které bych často navštěvoval (RedHat, Debian, Ubuntu atd.). Pro situace, kdy podporujete systémy, které neposkytují lsb_release Svůj vlastní bych použil jako součást distribuce softwaru, který poskytuji, podobně jako jeden z výše uvedených skriptů.

AKTUALIZACE #1:Následná akce se SuSE

Při rozhovoru s @Nils v komentářích níže bylo zjištěno, že z jakéhokoli důvodu se zdá, že SLES11 ve výchozím nastavení vypustil LSB. Byla to pouze volitelná instalace, která se zdála být v rozporu s balíčkem, který poskytuje tento typ klíčových funkcí.

Využil jsem tedy příležitosti kontaktovat někoho z projektu OpenSuSE, abych pochopil proč.

úryvek e-mailu

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

Zde je Robova odpověď

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 

Protože pravděpodobně nebudete moci nainstalovat facter na vzdáleném serveru můžete napodobit, co dělá při hledání názvu operačního systému. Ruby kód pro operatingsystem fakt najdete zde na pastebinu. V zásadě se dívá přes různé *-release soubory a další k určení názvu OS.

Některé soubory, na které se dívá:

/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

Je nám líto, pokud v tomto seznamu najdete duplikáty, vytvořil jsem jej rychle pomocí grep . Mělo by být poměrně snadné (i když trochu zdlouhavé) přenést to do skriptu shellu POSIX.


V případě, že máte python nainstalovaný (nezáleží na tom, zda Python 3 nebo Python 2), můžete zjistit název distribuce bez vynalézání kola :

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

Linux
  1. Jak zkontrolovat datum instalace vašeho linuxového operačního systému?

  2. Linux:Jak získat všechny přihlašovací protokoly ze systému?

  3. Jak mohu získat stav klávesnice v Linuxu?

  1. Jak zkontroluji operační systém v Pythonu?

  2. Jak získat aktuální operační systém v MSBuild?

  3. Jak mohu změnit čas, než se systém zamkne?

  1. Jak získám uživatelské jméno v souboru Makefile?

  2. Jak mohu získat dočasnou složku počítače se systémem maven?

  3. Jak se mohu ujistit, že můj systém používá soubor ~/.screenrc?