Bagaimana cara mengetahui apakah platform yang dijalankan adalah Ubuntu atau CentOS dengan bantuan skrip Bash?


39

Saya tahu perintah untuk memeriksa nama mesin Linux yang berjalan di mesin saya. Sebagai contoh:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

Bagaimana cara mendapatkan output dari terminal dan membandingkan untuk melihat apakah itu adalah UBUNTU atau CENTOS dan melakukan perintah berikut?

apt-get install updates 

atau

yum update

Ubuntu 14.04

cat /etc/issue

2
Selamat Datang di Tanya Ubuntu. Tolong, bisakah Anda meluangkan waktu untuk membaca Apa yang harus saya lakukan ketika seseorang menjawab pertanyaan saya?
Sylvain Pineau

Jawaban:


53

Sayangnya, tidak ada cara yang pasti dan sederhana untuk mendapatkan nama distribusi. Sebagian besar distro besar sedang bergerak menuju sistem tempat mereka menggunakannya /etc/os-releaseuntuk menyimpan informasi ini. Sebagian besar distribusi modern juga menyertakan lsb_releasealat tetapi ini tidak selalu diinstal secara default. Jadi, berikut adalah beberapa pendekatan yang dapat Anda gunakan:

  1. Menggunakan /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. Gunakan lsb_releasealat jika tersedia

    lsb_release -d | awk -F"\t" '{print $2}'
  3. Gunakan skrip yang lebih rumit yang berfungsi untuk sebagian besar distro:

    # 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. Pisahkan info versi gccjika terpasang:

    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.

Ini pada dasarnya telah disalin langsung dari jawaban bagus @ slm untuk pertanyaan saya di sini .


"Sayangnya, tidak ada cara yang pasti dan sederhana untuk mendapatkan nama distribusi." <— Ini bukan masalahnya sama sekali. Sylvain Pineau , misalnya, menunjukkan satu-liner sepele andal menanyakan jenis platform saat ini dengan menunda ke Python - yang datang diinstal pada kebanyakan platform (termasuk Ubuntu). Skrip Shell tidak boleh mencoba untuk melakukan query metadata platform secara manual dengan level rendah, tes non-portabel dari jenis yang diterapkan dalam jawaban ini.
Cecil Curry

Gawk tidak diinstal di Debian secara default.
Ville Laitila

@VilleLaitila Saya khawatir itu tidak relevan di sini karena situs ini hanya tentang Ubuntu. Tetapi tidak ada yang spesifik-gawk di sini, jadi awkatau mawkatau implementasi lain akan bekerja dengan baik.
terdon

Bahkan lebih spesifik menggunakan lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode

@ NerdOfCode jika Anda hanya ingin nomor rilis, lakukan lsb_release -d | awk '{print $3}'atau grep -oP 'VERSION="\K\S+' /etc/os-release, tidak perlu untuk pipa ganda awk.
terdon

25

Anda tidak perlu bash untuk melakukan tugas seperti itu, dan saya sarankan menggunakan pendekatan tingkat tinggi untuk menghindari berurusan dengan file seperti /etc/versiondan /etc/issue(saya tidak punya / etc / versi pada 13.10).

Jadi rekomendasi saya adalah menggunakan perintah ini sebagai gantinya:

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

Modul platform python akan bekerja pada kedua sistem, sisa perintah akan memeriksa apakah Ubuntu dikembalikan oleh python dan menjalankan yang apt-getlain yum.


tambahkan -ike grepdapat membantu.
coanor

8

Inilah jawaban sederhana yang saya temukan berfungsi di semua versi Ubuntu / CentOS / RHEL hanya dengan kehadiran file (tentu saja tidak aman tentunya jika seseorang secara acak menjatuhkan / etc / redhat-release di kotak Ubuntu Anda, dll):

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

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

di ubuntu saya tidak ada / etc / lsb-release
noonex

3
Saya tidak akan ke -1, tetapi jawaban ini tidak benar dalam setidaknya satu kasus: /etc/lsb-releaseada di CloudLinux (CentOS) 6.8 sehingga akan mengembalikan keduanya yumdan apt-get.
dhaupin

5

Gunakan Chef untuk tugas-tugas ini. ;-)

Di Chef, Anda dapat menggunakan platform?metode ini:

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

Atau:

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

Atau:

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

Atau:

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

1
Sementara terbukti lebih baik daripada non-solusi rapuh berpusat pada shell tingkat rendah (mis. lsb_release, /etc/os-release), Solusi ini memiliki kelemahan yang berbeda yaitu membutuhkan Chef - kerangka Infrastruktur berat sebagai Kode (IaC) kerangka kerja yang tidak dipasang secara default pada sebagian besar platform dan membutuhkan penggunaan bahasa spesifik domain (DSL) -nya sendiri. Singkatnya, sebagian besar pengguna mungkin hanya ingin menunda untuk Python , yang adalah terinstal secara default pada kebanyakan platform (termasuk Ubuntu) dan interface baik dengan shell scripting.
Cecil Curry

5

Periksa Ubuntu dengan nama kernel:

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

jika hanya ada dua distro, maka Anda dapat membuatnya lebih pendek:

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

entah bagaimana yum -vmengembalikan non-nol di CentOS jadi gunakan whichsaja,
tentu saja Anda harus mempertimbangkan skenario jika tidak ada yang whichdiinstal.


2

Skrip berikut harus memberi tahu apakah itu Ubuntu. Jika tidak dan satu-satunya opsi lain yang Anda miliki adalah CentOS, Anda harus memilikinya dalam elseklausa:

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

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

1
Ini mungkin dapat disederhanakan menggunakan lsb_releasealat, yang seharusnya membaca file yang sama. lsb_release -imelaporkan salah satu Distributor ID: Ubuntuatau Distributor ID: CentOSdalam kasus ini.
chronitis

@ sinkitis: ya, tentu bisa
jobin

Saya tidak berpikir itu tersedia secara default pada Centos
Sylvain Pineau

1

Jalankan /etc/os-releasedi sub shell dan gema nilainya:

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

0

Saya akan menggunakan python

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

Menggunakan perintah ini berfungsi di CentOS, Ubuntu dan Debian: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

Di Debian ia menghasilkan Debian GNU/Linux, di Ubuntu menghasilkan Ubuntudan di CentOS menghasilkan CentOS Linux.

Keuntungan menggunakan grep, cut, dan sed bukan gawk sudah jelas: Debian tidak memiliki gawk yang terinstal secara default, jadi Anda tidak bisa bergantung padanya pada kotak Debian acak.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.