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