it-swarm-vi.com

Làm cách nào tôi có thể nhận được tên phân phối và số phiên bản trong tập lệnh Shell đơn giản?

Tôi đang làm việc với một tập lệnh bash đơn giản có thể chạy trên các bản phân phối Ubuntu và CentOS (hỗ trợ cho Debian và Fedora/RHEL sẽ là một điểm cộng) và tôi cần biết tên và phiên bản của bản phân phối mà tập lệnh đang chạy ( để kích hoạt các hành động cụ thể, ví dụ như việc tạo các kho lưu trữ). Cho đến nay những gì tôi có là đây:

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

Điều này dường như để hoạt động, trả về ubuntu hoặc centos (Tôi chưa thử người khác) làm tên phát hành. Tuy nhiên, tôi có cảm giác rằng phải có một cách dễ dàng hơn, đáng tin cậy hơn để tìm ra điều này - điều đó có đúng không?

Nó không hoạt động cho RedHat./etc/redhat-phát hành có chứa: Redhat Linux Entreprise phát hành 5.5

Vì vậy, phiên bản không phải là từ thứ ba, bạn nên sử dụng tốt hơn:

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"
200
Alix Axel

Để có được OSVER, tiêu chuẩn mới nhất dường như là /etc/os-release. Trước đó, đã có lsb_release/etc/lsb-release. Trước đó, bạn phải tìm các tệp khác nhau cho mỗi bản phân phối.

Đây là những gì tôi muốn đề xuất

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

Tôi nghĩ rằng uname để có được Arch vẫn là cách tốt nhất. Nhưng ví dụ bạn đưa ra rõ ràng chỉ xử lý các hệ thống Intel. Tôi sẽ gọi nó là BITS như thế này:

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

Hoặc thay đổi Arch thành phiên bản phổ biến hơn nhưng không rõ ràng: x86x64 hoặc tương tự:

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

nhưng tất nhiên điều đó tùy thuộc vào bạn.

194
Mikel

Tôi sẽ thực hiện bước này như một bước đầu tiên:

ls /etc/*release

Gentoo, RedHat, Arch & SuSE có một tệp gọi là ví dụ: /etc/gentoo-release. Có vẻ là phổ biến, hãy kiểm tra trang web này về tệp phát hành .

Debian & Ubuntu nên có /etc/lsb-release cũng chứa thông tin phát hành và sẽ hiển thị với lệnh trước đó.

Một cách nhanh chóng khác là uname -rv. Nếu kernel được cài đặt là kernel distro stock, bạn sẽ thông thường đôi khi tìm thấy tên trong đó.

59
Mat

lsb_release -a. Hoạt động trên Debian và tôi đoán Ubuntu, nhưng tôi không chắc về phần còn lại. Thông thường nó nên tồn tại trong tất cả các bản phân phối GNU/Linux vì nó có liên quan đến LSB (Cơ sở tiêu chuẩn Linux).

37
sakisk

Một lớp lót, dự phòng, một dòng đầu ra, không có lỗi.

( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
24
Markus
python -m platform

đầu ra mẫu:

Ubuntu:

Linux-4.9.184-linuxkit-x86_64-with-Ubuntu-18.04-bionic

Debian:

Linux-4.14.117-grsec-grsec+-x86_64-with-debian-buster-sid

Centos:

Linux-3.10.0-957.1.3.el7.x86_64-x86_64-with-centos-7.6.1810-Core

Mac OS X:

Darwin-17.7.0-x86_64-i386-64bit

Xem tài liệu mô-đun nền tảng nếu bạn cần một giá trị cụ thể từ dòng đó. Ví dụ: nếu bạn chỉ cần tên phân phối Linux, hãy sử dụng

python -c "import platform;print(platform.linux_distribution()[0])"
13
Ilya Kharlamov
  1. lsb- * không được cài đặt/không tồn tại trên các hệ thống CentOS hoặc Debian cơ bản
  2. / Proc/* không tồn tại trên OSX

Lấy một mẹo từ các nhà phát triển javascript. Đừng kiểm tra phiên bản, hãy kiểm tra khả năng. Nó không đẹp, nhưng nó hoạt động. Mở rộng khi cần thiết.

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
}  
9
Orwellophile

Đối với hầu hết các hệ điều hành Linux hiện đại, tệp /etc/os-release đang thực sự trở thành tiêu chuẩn và được đưa vào hầu hết các hệ điều hành. Vì vậy, bên trong tập lệnh Bash của bạn, bạn chỉ có thể bao gồm tệp và bạn sẽ có quyền truy cập vào tất cả các biến được mô tả tại đây (ví dụ: NAME, VERSION, ...)

Vì vậy, tôi chỉ sử dụng điều này trong tập lệnh Bash của mình:

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
6
Chris Maes

Để thành công nhất có thể, những điều sau đây:

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

bao gồm hầu hết các trường hợp (AFAIK): Debian, Ubuntu, Slackware, Suse, Redhat, Gentoo, * BSD và có lẽ những người khác.

6
Eelvex

Nếu tập tin /etc/debian_version tồn tại, bản phân phối là Debian hoặc dẫn xuất Debian. Tập tin này có thể có một số phát hành; trên máy của tôi hiện tại là 6.0.1. Nếu nó đang thử nghiệm hoặc không ổn định, nó có thể nói thử nghiệm/không ổn định, hoặc nó có thể có số lượng phát hành sắp tới. Ấn tượng của tôi là trên Ubuntu ít nhất, tệp này luôn kiểm tra/không ổn định và họ không đặt số phát hành trong đó, nhưng ai đó có thể sửa cho tôi nếu tôi sai.

Fedora (ít nhất là các bản phát hành gần đây), có một tệp tương tự, cụ thể là /etc/Fedora-release.

3
Faheem Mitha

Nếu bạn không thể hoặc không muốn sử dụng tệp phát hành LSB (do phụ thuộc mà gói mang lại), bạn có thể tìm các tệp phát hành dành riêng cho bản phân phối. Bcfg2 có một đầu dò cho bản phân phối mà bạn có thể sử dụng: http: //trac.mcs.anl .gov/dự án/bcfg2/browser/doc/server/plugin/thăm dò/group.txt

2
jsbillings

2 cách từ nhiều người:

1) sử dụng

lsb_release -a

Tôi đã thử nghiệm nó trên CentOS 5.5 và Ubuntu 10.04

đầu ra cho CentOS là:

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

và đối với Ubuntu là:

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) nhập lệnh sau:

cat /etc/*-release

Tôi đã thử nghiệm nó trên CentOS 5.5 và Ubuntu 10.04 và nó hoạt động tốt.

1
Sam

Tôi tìm thấy một tập lệnh tốt từ đây hoạt động cho hầu hết các bản linux phổ biến:

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

Không có phiên bản, chỉ có dist:

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

Nếu ai đó cần bản phân phối là tốt:

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

Đầu ra:

It is: 18.04

Thay đổi thành: lsb_release -sc để nhận bản phân phối:

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

Đầu ra:

It is: bionic
0
jturi

Điều này đã được thử nghiệm trên Ubuntu 14 và CentOS 7

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

Kịch bản này hoạt động trên Debian, (có thể cần một số Tweak trên Ubuntu)

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

Tôi sử dụng screenfetch tiện ích tập lệnh:

enter image description here

0
Drakonoved

Đây là phiên bản chech_distro đơn giản của tôi. ^^;

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

Có một facter Ruby gem, cung cấp cho bạn một số sự thật về os OS, nó phân tích các tệp phát hành HĐH, dữ liệu khác và in ra màn hình thiết bị đầu cuối. Bạn có thể thử như sau, bắt đầu với cài đặt rubygems:

# apt-get install rubygems

Vui lòng sử dụng trường hợp trên đủ điều kiện cho hệ điều hành của bạn. Sau đó cài đặt đá quý chính nó.

# gem install facter

Sau đó sử dụng:

$ facter

LƯU Ý: Xem các nguồn đá quý facter để có thêm thông tin trong cài đặt.

0