it-swarm-id.com

Bagaimana saya bisa mendapatkan nama distribusi dan nomor versi dalam skrip Shell sederhana?

Saya sedang mengerjakan skrip bash sederhana yang seharusnya dapat berjalan di distribusi Ubuntu dan CentOS (dukungan untuk Debian dan Fedora/RHEL akan menjadi nilai tambah) dan saya perlu tahu nama dan versi distribusi skrip yang sedang dijalankan ( untuk memicu tindakan tertentu, misalnya pembuatan repositori). Sejauh ini yang saya dapat adalah ini:

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

Ini tampaknya berfungsi, mengembalikan ubuntu atau centos (Saya belum mencoba yang lain) sebagai nama rilis. Namun, saya punya perasaan bahwa harus ada cara yang lebih mudah, lebih dapat diandalkan untuk menemukan ini - apakah itu benar?

Itu tidak bekerja untuk RedHat./etc/redhat-release mengandung: Redhat Linux Entreprise release 5.5

Jadi, versi ini bukan Word ketiga, Anda sebaiknya menggunakan:

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

Untuk mendapatkan OS dan VER, standar terbaru tampaknya /etc/os-release. Sebelum itu, ada lsb_release dan /etc/lsb-release. Sebelum itu, Anda harus mencari file yang berbeda untuk setiap distribusi.

Inilah yang saya sarankan

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

Saya pikir uname untuk mendapatkan Arch masih merupakan cara terbaik. Tetapi contoh yang Anda berikan jelas hanya menangani sistem Intel. Saya akan menyebutnya BITS menyukai ini:

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

Atau ubah Arch menjadi versi yang lebih umum, namun tidak ambigu: x86 dan x64 atau serupa:

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

tapi tentu saja itu terserah kamu.

194
Mikel

Saya akan menggunakan ini sebagai langkah pertama:

ls /etc/*release

Gentoo, RedHat, Arch & SuSE memiliki file bernama mis. /etc/gentoo-release. Tampaknya menjadi populer, periksa situs ini tentang file rilis .

Debian & Ubuntu harus memiliki /etc/lsb-release yang berisi info rilis juga, dan akan muncul dengan perintah sebelumnya.

Cara cepat lainnya adalah uname -rv. Jika kernel yang dipasang adalah kernel distro, Anda akan biasanya terkadang menemukan nama di sana.

59
Mat

lsb_release -a. Bekerja pada Debian dan saya kira Ubuntu, tapi saya tidak yakin tentang sisanya. Biasanya itu harus ada di semua distribusi GNU/Linux karena terkait dengan LSB (Linux Standard Base).

37
sakisk

Satu liner, fallback, satu garis output, tidak ada kesalahan.

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

output sampel:

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

Lihat platform module docs jika Anda memerlukan nilai tertentu dari baris itu. Misalnya, jika Anda hanya perlu nama distro Linux, gunakan

python -c "import platform;print(platform.linux_distribution()[0])"
13
Ilya Kharlamov
  1. lsb- * tidak diinstal/tidak ada pada basis CentOS atau sistem Debian
  2. / proc/* tidak ada di OSX

Ambil kiat dari pengembang javascript. Jangan menguji versi, uji kemampuan. Itu tidak cantik, tetapi berhasil. Perluas sesuai kebutuhan.

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

Untuk sebagian besar sistem OS Linux modern, file /etc/os-release benar-benar menjadi standar dan disertakan di sebagian besar OS. Jadi di dalam skrip Bash Anda, Anda cukup memasukkan file, dan Anda akan memiliki akses ke semua variabel yang dijelaskan di sini (misalnya: NAME, VERSION, ...)

Jadi saya hanya menggunakan ini dalam skrip Bash saya:

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

Agar sukses yang paling mungkin terjadi, ini:

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

mencakup sebagian besar kasus (AFAIK): Debian, Ubuntu, Slackware, Suse, Redhat, Gentoo, * BSD dan mungkin yang lainnya.

6
Eelvex

Jika file /etc/debian_version ada, distribusinya adalah Debian, atau turunan Debian. File ini mungkin memiliki nomor rilis; di komputer saya saat ini 6.0.1. Jika sedang diuji atau tidak stabil, itu bisa berarti pengujian/tidak stabil, atau mungkin ada nomor rilis yang akan datang. Kesan saya adalah bahwa pada Ubuntu setidaknya, file ini selalu diuji/tidak stabil, dan bahwa mereka tidak memasukkan nomor rilis di dalamnya, tetapi seseorang dapat memperbaiki saya jika saya salah.

Fedora (setidaknya rilis terbaru), memiliki file yang serupa, yaitu /etc/Fedora-release.

3
Faheem Mitha

Jika Anda tidak bisa atau tidak ingin menggunakan file rilis LSB (karena dependensi yang dibawa paket), Anda dapat mencari file rilis khusus distro. Bcfg2 memiliki probe untuk distro yang mungkin dapat Anda gunakan: http: //trac.mcs.anl .gov/proyek/bcfg2/browser/doc/server/plugins/probe/group.txt

2
jsbillings

2 cara dari banyak:

1) gunakan

lsb_release -a

Saya mengujinya pada CentOS 5.5 dan Ubuntu 10.04

output untuk CentOS adalah:

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

dan untuk Ubuntu adalah:

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) masukkan perintah berikut:

cat /etc/*-release

Saya mengujinya pada CentOS 5.5 dan Ubuntu 10.04, dan berfungsi dengan baik.

1
Sam

Saya menemukan skrip yang bagus dari sini yang berfungsi untuk sebagian besar dists linux yang umum:

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

Tanpa versi, hanya dist:

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

Jika seseorang membutuhkan distro juga:

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

Keluaran:

It is: 18.04

Ubah ke: lsb_release -sc untuk mendapatkan distro:

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

Keluaran:

It is: bionic
0
jturi

Ini diuji pada Ubuntu 14 dan CentOS 7

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

Skrip ini berfungsi pada Debian, (mungkin memerlukan Tweak di 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

Saya menggunakan screenfetch utilitas skrip:

enter image description here

0
Drakonoved

Ini adalah versi chech_distro sederhana saya. ^^;

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

Ada facter Ruby permata, yang memberi Anda beberapa fakta tentang os OS, itu menganalisis file rilis OS, data lain dan mencetak ke layar terminal. Anda dapat mencoba adalah sebagai berikut, dimulai dengan instalasi rubygems:

# apt-get install rubygems

Silakan gunakan kasing di atas yang memenuhi syarat untuk OS Anda. Kemudian instal permata itu sendiri.

# gem install facter

Kemudian gunakan:

$ facter

CATATAN: Lihat sumber permata facter untuk mendapatkan info lebih lanjut dalam pemasangan.