Làm thế nào để biết nền tảng đang chạy là Ubuntu hay CentOS với sự trợ giúp của tập lệnh Bash?


39

Tôi biết các lệnh để kiểm tra tên của máy Linux đang chạy trên máy của tôi. Ví dụ:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

Làm cách nào để tôi nhận được đầu ra từ thiết bị đầu cuối và so sánh để xem liệu đó là UBUNTU hay CENTOS và thực hiện các lệnh sau?

apt-get install updates 

hoặc là

yum update

Ubuntu 14.04

cat /etc/issue

2
Chào mừng bạn đến hỏi Ubuntu. Xin vui lòng, bạn có thể dành một chút thời gian của bạn để đọc Tôi nên làm gì khi ai đó trả lời câu hỏi của tôi?
Sylvain Pineau

Câu trả lời:


53

Thật không may, không có cách nào chắc chắn, đơn giản để có được tên phân phối. Hầu hết các distro chính đang tiến tới một hệ thống mà họ sử dụng /etc/os-releaseđể lưu trữ thông tin này. Hầu hết các bản phân phối hiện đại cũng bao gồm các lsb_releasecông cụ nhưng chúng không phải lúc nào cũng được cài đặt theo mặc định. Vì vậy, đây là một số cách tiếp cận bạn có thể sử dụng:

  1. Sử dụng /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. Sử dụng các lsb_releasecông cụ nếu có sẵn

    lsb_release -d | awk -F"\t" '{print $2}'
  3. Sử dụng một tập lệnh phức tạp hơn sẽ hoạt động cho phần lớn các bản phân phối:

    # 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. Phân tích thông tin phiên bản gccnếu được cài đặt:

    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.

Điều này về cơ bản đã được sao chép trực tiếp từ câu trả lời tuyệt vời của @ slm cho câu hỏi của tôi ở đây .


"Thật không may, không có cách nào chắc chắn, cách đơn giản để có được tên phân phối." <— Đây không phải là trường hợp nào cả. Sylvain Pineau , chẳng hạn, đã trưng bày một lớp lót tầm thường đáng tin cậy truy vấn loại nền tảng hiện tại bằng cách chuyển đến Python - được cài đặt sẵn trên hầu hết các nền tảng (bao gồm cả Ubuntu). Các kịch bản Shell không bao giờ nên cố gắng truy vấn thủ công siêu dữ liệu nền tảng với các thử nghiệm cấp thấp, không di động thuộc loại được triển khai trong câu trả lời này.
Cecil Curry

Gawk không được cài đặt trong Debian theo mặc định.
Ville Laitila

@VilleLaitila Tôi e rằng điều đó không liên quan ở đây vì trang web này chỉ nói về Ubuntu. Nhưng không có gì gawk cụ thể ở đây, vì vậy awkhoặc mawkhay ay thi khác sẽ chỉ làm việc tốt.
terdon

Thậm chí cụ thể hơn bằng cách sử dụng lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode

@NerdOfCode nếu bạn chỉ muốn số phát hành, làm lsb_release -d | awk '{print $3}'hoặc grep -oP 'VERSION="\K\S+' /etc/os-release, không cần ống đôi để awk.
terdon

25

Bạn không cần bash để thực hiện nhiệm vụ đó và tôi khuyên bạn nên sử dụng cách tiếp cận cấp cao để tránh xử lý các tệp như /etc/version/etc/issue(Tôi không có / etc / phiên bản vào ngày 13.10).

Vì vậy, đề nghị của tôi là sử dụng lệnh này thay thế:

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

Mô-đun nền tảng python sẽ hoạt động trên cả hai hệ thống, phần còn lại của lệnh sẽ kiểm tra xem Ubuntu có bị python trả về không và chạy apt-getkhác yum.


thêm -ivào grepcó thể giúp đỡ.
coanor 28/03/2016

8

Đây là một câu trả lời đơn giản mà tôi thấy hoạt động trên tất cả các phiên bản Ubuntu / CentOS / RHEL bởi sự hiện diện của các tệp (tất nhiên là không an toàn nếu ai đó thả ngẫu nhiên / etc / redhat-phát hành trên các hộp Ubuntu của bạn, v.v.):

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

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

trên Ubuntu của tôi không có / etc / lsb-phát hành
noonex

3
Tôi sẽ không đến -1, nhưng câu trả lời này không đúng trong ít nhất một trường hợp: /etc/lsb-releasetồn tại trên CloudLinux (CentOS) 6.8 vì vậy nó sẽ trả về cả hai yumapt-get.
dhaupin

5

Sử dụng Chef cho các nhiệm vụ này.;)

Trong Chef, bạn có thể sử dụng platform?phương pháp:

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

Hoặc là:

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

Hoặc là:

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

Hoặc là:

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

1
Trong khi trình diễn vượt trội so với mức thấp mong manh phi giải pháp vỏ làm trung tâm (ví dụ lsb_release, /etc/os-release), giải pháp này có nhược điểm riêng biệt của yêu cầu đầu bếp - một cơ sở hạ tầng nặng như Mã (IAC) khuôn khổ không được cài đặt theo mặc định trên hầu hết các nền tảng và yêu cầu sử dụng ngôn ngữ riêng của tên miền (DSL). Nói tóm lại, hầu hết người dùng có lẽ chỉ muốn trì hoãn Python , được cài đặt theo mặc định trên hầu hết các nền tảng (bao gồm Ubuntu) và giao diện tốt với kịch bản shell.
Cecil Curry

5

Kiểm tra Ubuntu trong tên 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

nếu chỉ có hai bản phân phối, thì bạn có thể làm cho nó ngắn hơn:

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

bằng cách nào đó yum -vtrả về giá trị khác không trong CentOS, vì vậy sử dụng whichthay vào đó,
tất nhiên bạn nên xem xét kịch bản nếu không có whichcài đặt.


2

Kịch bản sau đây sẽ cho biết nếu đó là Ubuntu. Nếu nó không phải và tùy chọn duy nhất khác bạn có là CentOS, bạn nên có nó trong một elsemệnh đề:

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

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

1
Điều này có lẽ có thể được đơn giản hóa bằng cách sử dụng lsb_releasecông cụ, nên đọc các tệp tương tự. lsb_release -ibáo cáo Distributor ID: Ubuntuhoặc Distributor ID: CentOStrong những trường hợp này.
viêm chron

@ Sync viêm: có, chắc chắn là có thể
jobin

Tôi không nghĩ rằng nó có sẵn theo mặc định trên Centos
Sylvain Pineau

1

Thực thi /etc/os-releasetrong một vỏ phụ và lặp lại giá trị của nó:

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

0

Tôi sẽ sử dụng trăn

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

Sử dụng lệnh này hoạt động trong CentOS, Ubuntu và Debian: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

Trong Debian nó mang lại Debian GNU/Linux, trong Ubuntu nó mang lại Ubuntuvà trong CentOS, nó mang lại CentOS Linux.

Lợi ích của việc sử dụng grep, cut và sed thay vì gawk là rõ ràng: Debian không có cài đặt gawk theo mặc định, vì vậy bạn không thể dựa vào nó trên hộp Debian ngẫu nhiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.