Dağıtım adını ve sürüm numarasını basit bir kabuk betiğinde nasıl alabilirim?


191

Ubuntu ve CentOS dağıtımlarında çalışabilmesi gereken basit bir bash betiği üzerinde çalışıyorum (Debian ve Fedora / RHEL desteği artı olabilir) ve betiğin çalıştığı dağıtımın adını ve sürümünü bilmem gerekiyor ( belirli eylemleri tetiklemek için, örneğin havuzların oluşturulması). Şimdiye dek elimde olan şu:

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

Bu işe yarayacak gibi görünüyor , ubuntuya da centos(başkalarını denemedim) sürümün adı olarak. Bununla birlikte, bunu keşfetmenin daha kolay ve daha güvenilir bir yolu olması gerektiğini hissediyorum - bu doğru mu?

RedHat için çalışmıyor. / etc / redhat-release içerir: Redhat Linux Girişim sürümü 5.5

Yani, sürüm üçüncü kelime değil, daha iyi kullanmalısınız:

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"

İşe +-releaseyaradığından emin misin? Etkili olacağını varsayıyor gibi görünüyorsun /etc/lsb-release, bu yüzden belki de öyle diyorsun.
Mikel

@Mikel: Yorum oluşturmaktan kaçınmak için *ile yer değiştirdim +, olması gerektiği etc/*-releasegibi görünüyor.
Alix Axel

8
Doğru biçimlendirme elde etmek için asla bir sözdizimi hatası vermeyin. Ayrıca, biçimlendirme yalnızca önizlemede yanlıştır, son görünüm etiketlerden sözdizimini alır.
Gilles

Neden kimse bu fedan bahsetmiyor uname -rv | grep -i "name_of_distro"ve çıkış kodunu kullanmıyor?
kaçak

Yanıtlar:


182

Almak için OSve VERson standart olarak görünüyor /etc/os-release. Ondan önce lsb_releaseve vardı /etc/lsb-release. Ondan önce, her dağıtım için farklı dosyalar aramanız gerekiyordu.

İşte önereceğim şey

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

Bence unamealmak için ARCHhala en iyi yoldur. Ancak verdiğiniz örnek açıkça yalnızca Intel sistemlerini kullanıyor. Ben de buna şöyle derdim BITS:

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

Veya ARCHdaha yaygın, ancak kesin olmayan sürümler olarak değiştirin: x86ve x64veya benzeri:

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

ama tabii ki bu size kalmış.


2
Lsb_release'i kontrol eder ve eğer mümkünse kullanırdım, ama her yerde mevcut değil. Örneğin, Fedora 14'ün varsayılan yüklemesinde değil.
Steven D

Gerçekten mi? Eğer bunu yazım denedin mi -ve _? Belki de öyle bir /lib/lsbyerdedir. Ne rpm -qa "lsb*"yazdırır?
Mikel

1
rpm -qa "lsb*hiçbir şey basmaz. Buna göre yum provides */lsb_releaseredhat-lsb adlı bir pakette bulunur ve sanırım varsayılan olarak yüklenmez. Ancak, ben bir Fedora uzmanı değilim, bunlar sadece sahip olduğum rastgele bir Fedora VM'nin sonuçları ve çok yanlış olabilir.
Steven D

3
Az önce Fedora 14'ü bir sanal makineye kurdum ve lsb-releasedediğiniz gibi , yok .
Mikel

5
Kullanmayın $OS, $VERSIONvb - Kongre tarafından, biz çevre değişkenleri (PAGER, EDİTÖR SHELL, ...) ve iç kabuk değişkenleri yararlanmak (BASH_VERSION RASGELE, ...). Diğer tüm değişken isimleri en az bir küçük harf içermelidir. Bu sözleşme, çevresel ve dahili değişkenleri yanlışlıkla geçersiz kılmayı önler.
Chris Down

58

İlk adım olarak bununla giderdim:

ls /etc/*release

Gentoo, RedHat, Arch & SuSE adında bir dosya var /etc/gentoo-release. Popüler görünüyor, sürüm dosyaları hakkında bu siteyi kontrol edin .

Debian & Ubuntu bir /etc/lsb-releasesürüm bilgisi de içermeli ve önceki komutu gösterecektir.

Bir başka hızlı olan uname -rv. Takılan çekirdek, stok dağıtımı çekirdeği ise, genellikle adı bazen orada bulabilirsiniz.


Debian'da uname -a.
tshepang

2
gelmez uname -rvolsa bilgi içeriyor? uname -aBurada ilgisiz olan işlemci türü ve ana bilgisayar adı gibi şeyler yazdıracaktır. (Ancak hem çekirdek sürümü ( -r) hem de sürüm ( -v) gereklidir, tüm dağıtımlar aynı şeyi yapmaz)
Mat

'uname -r verir 2.6.32-5-686-bigmemve 'uname -v verir #1 SMP Tue Mar 8 22:14:55 UTC 2011Debian 6. 'uname -a OTOH verir Linux debian 2.6.32-5-686-bigmem #1 SMP Tue Mar 8 22:14:55 UTC 2011 i686 GNU/Linux.
tshepang

ikinci kısmı uname -aise -n; yani nodename == hostname. Ben unamede Debian’da ilginç olmayacağını söyleyebilirim . Bir düşünün, RedHat'ta da çok faydalı olduğundan emin değilim.
Mat

Ah tamam. Bu yüzden sadece benim ana bilgisayar adımı varsayılan olarak ayarladığım için şans debian.
tshepang

36

lsb_release -a. Debian üzerinde çalışıyor ve sanırım Ubuntu, ama geri kalanından emin değilim. Normalde LSB (Linux Standard Base) ile ilgili olduğu için tüm GNU / Linux dağıtımlarında bulunmalıdır.


3
Gentoo'da varsayılan olarak kurulu değildir. Fedora'da da bir noktada varsayılan değildi (muhtemelen şimdi olsa da)
Mat

2
Bu Debian sıkışıklığı, Fedora 14 ve OpenSUSE 11.3'te çalıştı. Debian ve SUSE’de lsb_release içeren paket lsb-release, Fedora’da redhat-lsb idi. Debian ve SUSE’ye kurulmuştu ancak Fedora’ya yüklenmedi. Bence şu ana kadarki en iyi cevap bu. +1.
Faheem Mitha

3
lsb_release, CentOS 6 minimum kurulumunun bir parçası değildir.
bir kodlayıcı

1
lsb_release -a , Raspbian ( Debian 7.1 türetilmiş) içeren Ahududu üzerinde "-bash: lsb_release: komut bulunamadı" ifadesini döndürür .
Peter Mortensen

lsb_release -a Red Hat Enterprise Linux Server 6.6 (Santiago) sürümünde çalışır
jwilleke

21

Tek astar, geri dönüşler, bir çıktı satırı, hata yok.

lsb_release -ds 2>/dev/null || cat /etc/*release 2>/dev/null | head -n1 || uname -om

Güzel teşekkür ederim. Bunun hala Mac OS X'te çalışmadığını unutmayın, ancak Ubuntu ve CentOS'ta (bu üç kullanışlı olan) iyi çalışıyor.
Joker

2
Parlak! Neden böyle bir bueatiful cevap üstte değil?
Neo

13
python -c "import platform;print(platform.platform())"

ya da sadece

python -m platform

9
  1. lsb- * , CentOS veya Debian sistemlerinde mevcut değildir / mevcut değildir
  2. / proc / * OSX’de mevcut değil

Javascript geliştiricilerinden bir ipucu alın. Sürümü test etmeyin, kabiliyeti test edin. Güzel değil ama işe yarıyor. Gerektiği gibi genişletin.

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
}  

6
Yum, Red Hat, Scientific Linux veya Fedora olabilir. Fedora için Debian's'ı taklit eden bir apt komutu vardı. Ve bunun gibi. CentOS size Red Hat 4'ten Fedora 18'e kadar bir dizi destek sistemi sağladığından, buradaki yaklaşık 8 yıllık bir Linux tarihi var. <foo> tarafından desteklenip desteklenmediğini bilmek gerekirse, (güvenilmez) dağıtım kimliğine dayanarak tahmin etmek yerine özellikle <foo> 'yu kontrol edin! Tabii ki, bu ilk otomatik araçların bir şey yol açar, ancak bu yardım edilemez (Unix savaşlarının bittiği için $ DEITY teşekkür ederiz).
von

@ vonbrand gerçekten dediğiniz gibi. alt lezzetleri ayırt etmeye çalışmıyorum. ve check-in sırasını (inşallah), çok fazla araştırma yapmadığım halde, zor durumların çoğunu (apt-get yüklü RHEL) siler. Eğer RHEL apt-get'ine sahipse ve Ubuntu kullanıcıları yum ... varsa, sadece şansınız tükenir.
Orwellophile

6

Muhtemel başarı için, bunlar:

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

Çoğu vakayı kapsar (AFAIK): Debian, Ubuntu, Slackware, Suse, Redhat, Gentoo, * BSD ve belki diğerleri.


cat /etc/*versionçalışmıyor (böyle bir dosya yok) CentOS'ta (en az 6.4)
om-nom-nom

Komutu bir kapsayıcıda çalıştırırsanız, / proc / version, HOST dağıtım sürümünü içerecektir, kap dağıtımını değil.
Dereckson

5

Çoğu modern Linux işletim sistemi için, dosya /etc/os-releasegerçekten standart hale geliyor ve çoğu işletim sistemine dahil oluyor. Böylece Bash betiğinizin içine sadece dosyayı ekleyebilirsiniz ve burada açıklanan tüm değişkenlere erişebileceksiniz (örneğin: NAME, VERSION, ...)

Yani bunu sadece Bash senaryomda kullanıyorum:

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

3

Dosya /etc/debian_versionvarsa, dağıtım Debian veya bir Debian türevidir. Bu dosyanın bir sürüm numarası olabilir; benim makinemde şu anda 6.0.1. Test ediyorsa veya dengesizse, test ediyor / dengesiz olabilir veya yaklaşan sürümün numarası olabilir. Benim izlenimim, en azından Ubuntu'da, bu dosyanın her zaman test / dengesiz olduğu ve sürüm numarasını bu kodlara koymadıkları, ancak yanlış olduğumda biri beni düzeltebileceği yönünde.

Fedora (en azından son sürümlerde), yani benzer bir dosyaya sahip /etc/fedora-release.


Daha yeni Debian sürümleri yerine / etc / os-release kullanın.
Dereckson

1
@Dereckson benim hışıltılı makineyi kontrol ve hem sahiptir /etc/debian_versionve /etc/os-release.
Faheem Mitha

Debootstrap ile oluşturulan bir Jessie chroot'ta test edilmiştir. Ama aslında, Jessie'nin altındaki yerel bir makine, bu sefer daha geleneksel bir şekilde kurulmuş bir /etc/debian_versiondosya içeriyor . Bu yüzden bir Debian kurulumunu hazırlama şeklimiz mevcut sürüm dosyalarını etkileyebilir, bu ilginç.
Dereckson

Debian's os-release, tam sürüm numarasını içermez debian_version. Unix.stackexchange.com/questions/382531 adresine bakın .
JdeBP


1

Birçok 2 yolu:

1) kullanım

lsb_release -a

CentOS 5.5 ve Ubuntu 10.04 üzerinde test ettim.

CentOS için çıktı:

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

ve Ubuntu için:

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) aşağıdaki komutu girin:

cat /etc/*-release

CentOS 5.5 ve Ubuntu 10.04 üzerinde test ettim ve iyi çalışıyor.


lsb_release CentOS 6'da değildir (dk. fwiw kurulumu)
bir kodlayıcı

lsb_release -a , Raspbian ( Debian 7.1 türetilmiş) içeren Ahududu üzerinde "-bash: lsb_release: komut bulunamadı" ifadesini döndürür .
Peter Mortensen

0

Bu script Debian'da çalışıyor, (Ubuntu'da biraz ince ayar yapmak gerekebilir)

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

İşte benim basit chech_distro sürümü. ^^;

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

Sürüm olmadan, sadece dikkat:

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

Yahya Yahyaoui tarafından bir yıl önceki bir cevap da aynı şeyi söyledi. Bu cevapların her ikisi de 2011 yılında silinmiş olan cevaplarla ele alınmıştır. Yanılma nedenleri hala geçerlidir.
JdeBP,

0

Bu Ubuntu 14 ve CentOS 7'de test edildi

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

@don_crissti Nasıl yaparsın?
BsdHelper

sed -n -e '/PRETTY_NAME/ s/^.*=\|"\| .*//gp' /etc/os-release
kasn

@cas Çok hoş! Bunu araç kutuma ekliyorum. Paylaşım için teşekkürler.
BsdHelper

0

Buradan , genel linux bölgelerinin çoğunda işe yarayan iyi bir senaryo buluyorum:

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

Size os OS hakkında bazı gerçekler veren bir yüzgeçli yakut taşı vardır, işletim sistemi sürüm dosyalarını, diğer verileri analiz eder ve terminal ekranına yazdırır. Aşağıdakileri deneyebilirsiniz, rubygems kurulumu ile başlayın:

# apt-get install rubygems

Lütfen işletim sisteminize uygun olan yukarıdaki davayı kullanın. Ardından gem'in kendisini kurun.

# gem install facter

Sonra kullan:

$ facter

NOT: Kurulumda daha fazla bilgi almak için faster mücevher kaynaklarına bakın.


0

Birinin de dağıtıma ihtiyacı varsa:

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

Çıktı:

It is: 18.04

Şunu değiştir: lsb_release -sc dağıtımını yapmak için:

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

Çıktı:

It is: bionic

-3

Bu komut Debian tabanlı ve Redhat tabanlı dağıtımlar için geçerlidir: trFiltreyi kullanarak dokümanı satır başına bir kelime biçimine dönüştürür ve ardından dağıtım adını içeren ilk satırı sayarsınız.

tr -s ' \011' '\012' < /etc/issue | head -n 1

2011'den itibaren silinmiş cevap üzerine aynı şeyi söyleyen yorumlar hala geçerli. Yanlış yerleştirilmiş cevap, şimdi tekrar silindi, ki bu /etc/issuezenwalk'ta bir sürüm veya isim içermediğini söyledi . Bu, programlı olarak çıkarılabilecek hiçbir şey içerme garantisi olmayan, insanlara sunulan bir mesaj içeren, yönetici tarafından değiştirilebilir bir dosyadır .
JdeBP
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.