Çalışan platformun Bash komut dosyası yardımıyla Ubuntu veya CentOS olup olmadığını nasıl anlarım?


39

Makinemde çalışan Linux makinesinin adını kontrol etme komutlarını biliyorum. Örneğin:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

Çıktıyı terminalden alıp UBUNTU veya CENTOS olup olmadığını görmek ve aşağıdaki komutları nasıl uygularım?

apt-get install updates 

veya

yum update

Ubuntu 14.04

cat /etc/issue

2
Ubuntu'ya Sormaya Hoş Geldiniz. Lütfen okumaya biraz zaman ayırabilir misin? Birisi sorumu cevapladığında ne yapmalıyım?
— Sylvain Pineau

Yanıtlar:


53

Maalesef, dağıtım adını almanın kesin bir yolu yok. Çoğu dağıtım ,/etc/os-release bu bilgiyi depolamak için kullandıkları bir sisteme doğru ilerlemektedir . Çoğu modern dağıtım lsb_releasearaçları da içerir, ancak bunlar varsayılan olarak her zaman yüklenmez. Yani, burada kullanabileceğiniz bazı yaklaşımlar:

  1. kullanım /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. lsb_releaseVarsa araçları kullanın

    lsb_release -d | awk -F"\t" '{print $2}'
  3. Dağıtımların büyük çoğunluğu için çalışması gereken daha karmaşık bir komut dosyası kullanın:

    # 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
  4. gccYüklü ise sürüm bilgilerini ayrıştırın :

    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.

    Ubuntu 14.04

    $ gcc --version
    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
    Copyright (C) 2013 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Bu, temel olarak @ slm'nin buradaki soruma verdiğim büyük yanıttan doğrudan kopyalandı .


“Maalesef dağıtım adını almanın kesin bir yolu yok.” <— Bu hiç böyle değil. Örneğin, Sylvain Pineau , çoğu platformda (Ubuntu dahil) önceden kurulmuş olarak gelen Python'a erteleyerek mevcut platform tipini güvenilir bir şekilde sorgulayan önemsiz bir tek gömlek sergiledi . Shell komut dosyaları , bu cevapta uygulanan türdeki düşük düzeyli, taşınabilir olmayan sınamalarla platform meta verilerini hiçbir zaman el ile sorgulamaya çalışmamalıdır.
— Cecil Curry

Gawk, Debian'da varsayılan olarak kurulu değildir.
— Ville Laitila

@VilleLaitila Bu site sadece Ubuntu ile ilgili olduğu için burada alakalı değil. Fakat burada özel bir şey yok, awkya mawkda ya da başka bir uygulama da işe yarayacaktı.
— terdon

Kullanırken daha da özel lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
— NerdOfCode 4:18

Eğer sadece serbest bırakma numarasını istiyorsanız @NerdOfCode yapın lsb_release -d | awk '{print $3}'veya grep -oP 'VERSION="\K\S+' /etc/os-releaseçift ​​borunun awk yapmasına gerek yok.
— terdon

25

Böyle bir görevi yapmak için bash'a ihtiyacınız yok ve ben /etc/versionve benzeri dosyalarla uğraşmamak için üst düzey bir yaklaşım kullanmanızı öneririm /etc/issue(13.10'da / etc / version yok).

Bu yüzden benim tavsiyem yerine bu komutu kullanmaktır:

python -mplatform | grep -qi Ubuntu && sudo apt-get update || sudo yum update

python platform modülü her iki sistemde de çalışacak, komutun geri kalanı Ubuntu'nun python tarafından döndürülüp döndürülmeyeceğini kontrol edecek ve apt-getbaşka bir işlem yapacaktır yum.


eklemek -iiçin grepmayıs yardım.
— coanor,

8

İşte sadece Ubuntu / CentOS / RHEL’in tüm sürümlerinde dosyaların sadece varlığına göre çalıştığım basit bir cevap (Ubuntu kutularınıza rastgele / etc / redhat-salıverilen biri varsa elbette başarısız olmaz):

if [ -f /etc/redhat-release ]; then
  yum update
fi

if [ -f /etc/lsb-release ]; then
  apt-get update
fi

ubuntu'mda / etc / lsb-release yoktur
— noonex

3
: Ben -1 olarak gitmiyorum, ama bu bir çözüm, en az bir durumda doğru değil /etc/lsb-releasehem dönecektir böylece 6.8 CloudLinux (CentOS) üzerinde var yumve apt-get.
— dhaupin

5

Bu görevler için Chef kullanın . ;-)

Chef’de şu platform?yöntemi kullanabilirsiniz :

if platform?("redhat", "centos", "fedora")
  # Code for only Red Hat Linux family systems.
end

Veya:

if platform?("ubuntu")
  # Code for only Ubuntu systems
end

Veya:

if platform?("ubuntu")
  # Do Ubuntu things
end

Veya:

if platform?("freebsd", "openbsd")
  # Do BSD things
end

1
İçin kanıtlanabilir üstün olmakla birlikte , düşük seviyeli kabuk merkezli kırılgan olmayan çözeltiler (örn lsb_release, /etc/os-release), bu çözelti, şef gerektiren belirgin bir dezavantajı vardır - çerçeve kodu (IAC) gibi bir ağır Altyapı olmayan en platformlarda varsayılan ve kullanımını gerektiren yüklü kendi etki alanına özgü dili (DSL). Kısacası, çoğu kullanıcı muhtemelen sadece istediğiniz Python ertelemek , bir kabuk komut dosyası ile iyice çoğu (Ubuntu dahil) platformları ve arayüzleri üzerinde varsayılan olarak yüklü.
— Cecil Curry

5

Çekirdek adında Ubuntu olup olmadığını kontrol edin:

if [  -n "$(uname -a | grep Ubuntu)" ]; then
    sudo apt-get update && sudo apt-get upgrade 
else
    yum update
fi  

4
 apt-get -v &> /dev/null && apt-get update
 which yum &> /dev/null && yum update

sadece iki dağıtım varsa, onu kısaltabilirsiniz:

apt-get -v &> /dev/null && apt-get update || yum update

bir şekilde yum -vCentOS'ta sıfır olmayan bir değer döndürür which, bu nedenle kullanın ,
tabii ki whichkurulu değilse senaryoyu düşünmelisiniz .


2

Aşağıdaki komut dosyası Ubuntu olup olmadığını söylemelidir. Değilse ve sahip olduğunuz diğer seçenek CentOS ise, bir elsemaddeye eklemelisiniz :

dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi

1
Bu, muhtemelen lsb_releaseaynı dosyaları okuyacak olan aracı kullanarak basitleştirilebilir . lsb_release -iya Distributor ID: Ubuntuda Distributor ID: CentOSbu durumlarda raporlar .
— Kronit 02

@chronitis: evet, olabileceğinden emin olun
— jobin

Centos'te varsayılan olarak mevcut olduğunu sanmıyorum
— Sylvain Pineau

1

/etc/os-releaseBir alt kabukta yürütün ve değerini tekrarlayın:

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi

0

Python kullanırım

if ! python -c "exec(\"import platform\nexit ('centos' not in platform.linux_distribution()[0].lower())\")" ; then
   echo "It is not CentOS distribution, ignoring CentOS setup"
   exit 0
fi

0

Bu komutu kullanmak CentOS, Ubuntu ve Debian'da çalışır: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

Debian'da verimi Debian GNU/Linux, Ubuntu'da verimi Ubuntu, CentOS'ta verimi CentOS Linux.

Gawk yerine grep, cut ve sed kullanmanın yararı açıktır: Debian varsayılan olarak kurulu gawk'a sahip değildir, bu nedenle rastgele Debian kutusuna güvenemezsiniz.

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.