it-swarm-eu.dev

Jak získám distribuční název a číslo verze v jednoduchém skriptu Shell?

Pracuji na jednoduchém bash skriptu, který by měl být schopen běžet na distribucích Ubuntu a CentOS (podpora pro Debian a Fedora/RHEL by byla plus) a potřebuji znát název a verzi distribuce, kterou skript běží ( za účelem provedení konkrétních akcí, například vytvoření úložišť). Zatím mám toto:

OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
Arch=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')

if [ -z "$OS" ]; then
    OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi

if [ -z "$VERSION" ]; then
    VERSION=$(awk '{print $3}' /etc/*-release)
fi

echo $OS
echo $Arch
echo $VERSION

Toto zdá se funguje, vrací ubuntu nebo centos (nezkoušel jsem ostatní) jako název vydání. Mám však pocit, že musí existovat snazší a spolehlivější způsob, jak to zjistit - je to pravda?

Pro RedHat to nefunguje./etc/redhat-release obsahuje: Redhat Linux Entreprise verze 5.5

Takže verze není třetí slovo, raději byste měli použít:

OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/redhat-release`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/redhat-release`
echo "RedHat/CentOS $OS_MAJOR_VERSION.$OS_MINOR_VERSION"
200
Alix Axel

Chcete-li získat OS a VER, zdá se, že nejnovější standard je /etc/os-release. Před tím bylo lsb_release a /etc/lsb-release. Předtím jste museli hledat různé soubory pro každou distribuci.

Tady je to, co bych navrhl

if [ -f /etc/os-release ]; then
    # freedesktop.org and systemd
    . /etc/os-release
    OS=$NAME
    VER=$VERSION_ID
Elif type lsb_release >/dev/null 2>&1; then
    # linuxbase.org
    OS=$(lsb_release -si)
    VER=$(lsb_release -sr)
Elif [ -f /etc/lsb-release ]; then
    # For some versions of Debian/Ubuntu without lsb_release command
    . /etc/lsb-release
    OS=$DISTRIB_ID
    VER=$DISTRIB_RELEASE
Elif [ -f /etc/debian_version ]; then
    # Older Debian/Ubuntu/etc.
    OS=Debian
    VER=$(cat /etc/debian_version)
Elif [ -f /etc/SuSe-release ]; then
    # Older SuSE/etc.
    ...
Elif [ -f /etc/redhat-release ]; then
    # Older Red Hat, CentOS, etc.
    ...
else
    # Fall back to uname, e.g. "Linux <version>", also works for BSD, etc.
    OS=$(uname -s)
    VER=$(uname -r)
fi

Myslím, že uname získat Arch je stále nejlepší způsob. Ale příklad, který jste uvedli, zřejmě řeší pouze systémy Intel. Řekl bych tomu buď BITS takto:

case $(uname -m) in
x86_64)
    BITS=64
    ;;
i*86)
    BITS=32
    ;;
*)
    BITS=?
    ;;
esac

Nebo změňte Arch na běžnější, ale jednoznačné verze: x86 a x64 nebo podobné:

case $(uname -m) in
x86_64)
    Arch=x64  # or AMD64 or Intel64 or whatever
    ;;
i*86)
    Arch=x86  # or IA32 or Intel32 or whatever
    ;;
*)
    # leave Arch as-is
    ;;
esac

ale samozřejmě to záleží na tobě.

194
Mikel

Chtěl bych s tím jít jako první krok:

ls /etc/*release

Gentoo, RedHat, Arch & SuSE mají soubor nazvaný např. /etc/gentoo-release. Zdá se, že je populární, podívejte se na tento web o release-files .

Debian a Ubuntu by měly mít /etc/lsb-release, které také obsahuje informace o vydání a zobrazí se s předchozím příkazem.

Další rychlý je uname -rv. Pokud je nainstalované jádro zásobním distro jádrem, budete obvykle někdy tam jméno najdou.

59
Mat

lsb_release -a. Pracuje na Debianu a myslím, že Ubuntu, ale o zbytku si nejsem jistý. Normálně by měl existovat ve všech distribucích GNU/Linux, protože se týká LSB (Linux Standard Base).

37
sakisk

Jednoplášťové, záložní, jeden řádek výstupu, žádné chyby.

( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
24
Markus
python -m platform

ukázkové výstupy:

Ubuntu:

Linux-4.9.184-linuxkit-x86_64-with-Ubuntu-18.04-bionic

Debian:

Linux-4.14.117-grsec-grsec+-x86_64-with-debian-buster-sid

Centa:

Linux-3.10.0-957.1.3.el7.x86_64-x86_64-with-centos-7.6.1810-Core

Mac OS X:

Darwin-17.7.0-x86_64-i386-64bit

Pokud potřebujete konkrétní hodnotu z tohoto řádku, podívejte se na dokumenty modulů platformy . Například pokud potřebujete pouze distro jméno Linuxu, použijte

python -c "import platform;print(platform.linux_distribution()[0])"
13
Ilya Kharlamov
  1. lsb- * není nainstalován/neexistuje na základních systémech CentOS nebo Debian
  2. / proc/* v OSX neexistuje

Vezměte si tip od vývojářů javascriptu. Netestujte verzi, otestujte schopnost. Není to hezké, ale funguje to. Rozbalte podle potřeby.

function os_type
{
case `uname` in
  Linux )
     LINUX=1
     which yum && { echo centos; return; }
     which zypper && { echo opensuse; return; }
     which apt-get && { echo debian; return; }
     ;;
  Darwin )
     DARWIN=1
     ;;
  * )
     # Handle AmgiaOS, CPM, and modified cable modems here.
     ;;
esac
}  
9
Orwellophile

Pro většinu moderních systémů Linux OS soubor /etc/os-release se opravdu stává standardem a začleňuje se do většiny OS. Takže uvnitř skriptu Bash můžete pouze zahrnout soubor a budete mít přístup ke všem popsaným proměnným zde (například: NAME, VERSION, ...)

Takže to používám ve svém skriptu Bash:

if [ -f /etc/os-release ]
then
        . /etc/os-release
else
        echo "ERROR: I need the file /etc/os-release to determine what my distribution is..."
        # If you want, you can include older or distribution specific files here...
        exit
fi
6
Chris Maes

V pořadí nejpravděpodobnějších úspěchů:

cat /etc/*version
cat /proc/version #linprocfs/version for FreeBSD when "linux" enabled
cat /etc/*release
uname -rv

pokrývají většinu případů (AFAIK): Debian, Ubuntu, Slackware, Suse, Redhat, Gentoo, * BSD a možná i další.

6
Eelvex

Pokud soubor /etc/debian_version existuje, distribuce je Debian nebo derivát Debian. Tento soubor může mít číslo vydání; na mém počítači je aktuálně 6.0.1. Pokud je testování nebo nestabilní, může to znamenat testování/nestabilní, nebo může mít číslo připravovaného vydání. Mám dojem, že alespoň na Ubuntu je tento soubor vždy testován/nestabilní a že do něj nevloží číslo vydání, ale pokud se mýlím, může mě někdo opravit.

Fedora (alespoň poslední vydání), mají podobný soubor, jmenovitě /etc/Fedora-release.

3
Faheem Mitha

Pokud nemůžete nebo nechcete použít soubor vydání LSB (vzhledem k závislostem, které balíček přináší), můžete hledat soubory distro-specific release. Bcfg2 má sondu pro distro, kterou byste mohli použít: http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes /group.txt

2
jsbillings

2 způsoby z mnoha:

1) použití

lsb_release -a

Testoval jsem to na CentOS 5.5 a Ubuntu 10.04

výstup pro CentOS je:

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch 
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

a pro Ubuntu je:

LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description:    CentOS release 5.5 (Final)
Release:        5.5
Codename:       Final

2) zadejte následující příkaz:

cat /etc/*-release

Testoval jsem to na CentOS 5.5 a Ubuntu 10.04 a funguje to dobře.

1
Sam

Najdu dobrý skript odtud , který funguje pro většinu běžných linux dists:

#! /bin/bash
# return an awkable string consisting of
#    unix OS type, or
#    Linux dist, or
#    a long guess (based on /proc), or
#    no clue

giveUp () {
   echo "Unknown"
   exit 0
}

# keep this easily awkable, prepending an initial clue
versionGuess () {
   if [ -e /proc/version ]; then
      echo -n "Unsure "
      cat /proc/version
      exit 0
   fi
   return 1
}

# if we have ignition, print and exit
gotDist () {
   [ -n "$1" ] && echo "$1" && exit 0
}

# we are only interested in a single Word "dist" here
# various malformations can occur; admin will have to code appropately based on output
linuxRelease () {
   if [ -r /etc/lsb-release ]; then
      dist=$(grep 'DISTRIB_ID' /etc/lsb-release | sed 's/DISTRIB_ID=//' | head -1)
      gotDist "$dist"
   fi

   dist=$(find /etc/ -maxdepth 1 -name '*release' 2> /dev/null | sed 's/\/etc\///' | sed 's/-release//' | head -1)
   gotDist "$dist"

   dist=$(find /etc/ -maxdepth 1 -name '*version' 2> /dev/null | sed 's/\/etc\///' | sed 's/-version//' | head -1)
   gotDist "$dist"

   return 1
}

# start with uname and branch the decision from there
dist=$(uname -s 2> /dev/null)
if [ "$dist" = "Linux" ]; then
   linuxRelease
   versionGuess
   giveUp
Elif [ -n "$dist" ]; then
   echo "$dist"
   exit 0
else
   versionGuess
   giveUp
fi

# we shouldn't get here
giveUp
# done
0
Mithril

Bez verze, jen dist:

cat /etc/issue | head -n +1 | awk '{print $1}'
0
coanor

Pokud někdo také potřebuje distro:

#!/usr/bin/env bash

LINUX_VERSION_NAME=`lsb_release -sr`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "18.04" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

Výstup:

It is: 18.04

Změňte na: lsb_release -sc a získejte distro:

LINUX_VERSION_NAME=`lsb_release -sc`


# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "bionic" ]]
then
    echo "It is: ${LINUX_VERSION_NAME}"

else
    echo "It is not ${LINUX_VERSION_NAME}"
fi

Výstup:

It is: bionic
0
jturi

Toto bylo testováno na Ubuntu 14 a CentOS 7

cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print $1}'
0
BsdHelper

Tento skript funguje na Debianu (možná bude na Ubuntu potřebovat Tweak)

#!/usr/bin/env bash

echo "Finding Debian/ Ubuntu Codename..."

CODENAME=`cat /etc/*-release | grep "VERSION="`
CODENAME=${CODENAME##*\(}
CODENAME=${CODENAME%%\)*}

echo "$CODENAME"
# => saucy, precise, lucid, wheezy, squeeze
0
user9869932

Používám screenfetch skriptový nástroj:

enter image description here

0
Drakonoved

Zde je moje jednoduchá verze chech_distro. ^^;

#!/usr/bin/env bash
check_distro2(){
    if [[ -e /etc/redhat-release ]]
    then
      DISTRO=$(cat /etc/redhat-release)
    Elif [[ -e /usr/bin/lsb_release ]]
    then
      DISTRO=$(lsb_release -d | awk -F ':' '{print $2}')
    Elif [[ -e /etc/issue ]]
    then
      DISTRO=$(cat /etc/issue)
    else
      DISTRO=$(cat /proc/version)
    fi
    }

    check_distro2
    echo $DISTRO
0
niceguy oh

Existuje Facter Ruby drahokam, který vám dá několik faktů o OS OS, analyzuje uvolňovací soubory OS, další data a tiskne na obrazovku terminálu. Můžete vyzkoušet následující postup, který začíná instalací rubygemů:

# apt-get install rubygems

Použijte výše uvedený případ, který je vhodný pro váš operační systém. Poté nainstalujte samotný drahokam.

# gem install facter

Pak použijte:

$ facter

POZNÁMKA: Další informace o instalaci naleznete v zdrojích drahokamů Facter.