it-swarm.dev

간단한 셸 스크립트로 배포 이름과 버전 번호를 얻으려면 어떻게해야합니까?

우분투 및 CentOS 배포판에서 실행할 수있는 간단한 bash 스크립트를 작성 중입니다 (Debian 및 Fedora/RHEL에 대한 지원은 플러스 일 것입니다). 스크립트가 실행중인 배포판의 이름과 버전을 알아야합니다 ( 리포지토리 생성과 같은 특정 작업을 트리거하기 위해). 지금까지 내가 얻은 것은 다음과 같습니다.

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

seems 작동하면 릴리스 이름으로 ubuntu 또는 centos (다른 시도는하지 않음)을 반환합니다. 그러나 나는 이것을 더 쉽고 신뢰할 수있는 방법으로 찾아야한다고 생각합니다. 맞습니까?

RedHat에서는 작동하지 않습니다./etc/redhat-release는 다음을 포함합니다 : Redhat Linux Entreprise release 5.5

따라서 버전이 세 번째 단어가 아니므로 더 잘 사용하는 것이 좋습니다.

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

OSVER을 구하려면 최신 표준은 /etc/os-release. 그 전에는 lsb_release/etc/lsb-release. 그 전에는 각 배포판마다 다른 파일을 찾아야했습니다.

여기 내가 제안하는 것이 있습니다.

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

uname를 얻는 것이 Arch가 여전히 최선의 방법이라고 생각합니다. 그러나 여러분이 제시 한 예는 분명히 인텔 시스템 만 다룹니다. 다음과 같이 BITS라고 부르겠습니다.

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

또는 Arch를 더 일반적이지만 명확한 버전으로 변경하십시오. x86x64 또는 유사 항목 :

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

물론 그것은 당신에게 달려 있습니다.

194
Mikel

나는 이것을 첫 번째 단계로 진행할 것입니다.

ls /etc/*release

Gentoo, RedHat, Arch & SuSE는 예를 들어 /etc/gentoo-release. 인기가있는 것 같습니다 release-files 에 대해이 사이트를 확인하십시오.

데비안 & 우분투에는 /etc/lsb-release 여기에는 릴리스 정보도 포함되며 이전 명령과 함께 표시됩니다.

또 다른 빠른 방법은 uname -rv. 설치된 커널이 기본 배포판 커널 인 경우 보통 때때로 거기에서 이름을 찾으십시오.

59
Mat

lsb_release -a. 데비안에서 작동하며 우분투를 추측하지만 나머지는 확실하지 않습니다. 일반적으로 LSB (Linux Standard Base)와 관련되어 있기 때문에 모든 GNU/Linux 배포판에 존재해야합니다.

37
sakisk

하나의 라이너, 폴백, 한 줄의 출력, 오류 없음.

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

샘플 출력 :

우분투 :

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

데비안 :

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

센 토스 :

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

맥 OS X:

Darwin-17.7.0-x86_64-i386-64bit

해당 행에서 특정 값이 필요한 경우 플랫폼 모듈 문서 를 참조하십시오. 예를 들어 Linux 배포 이름 만 필요한 경우 다음을 사용하십시오.

python -c "import platform;print(platform.linux_distribution()[0])"
13
Ilya Kharlamov
  1. 기본 CentOS 또는 데비안 시스템에서 lsb- * 설치되지 않았거나 존재하지 않음
  2. / proc/* OSX에는 존재하지 않습니다

자바 스크립트 개발자로부터 팁을 얻으십시오. 버전을 테스트하지 말고 기능을 테스트하십시오. 예쁘지는 않지만 작동합니다. 필요에 따라 확장하십시오.

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

대부분의 최신 Linux OS 시스템의 경우 /etc/os-release은 실제로 표준이되어 대부분의 OS에 포함됩니다. 따라서 Bash 스크립트 안에 파일을 포함 시키면 here 에 설명 된 모든 변수에 액세스 할 수 있습니다 (예 : NAME, VERSION, ...).

그래서 나는 이것을 Bash 스크립트에서 사용하고 있습니다 :

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

가장 가능한 성공을 거두려면 다음을 수행하십시오.

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

대부분의 경우 (AFAIK) : 데비안, 우분투, 슬랙웨어, 수세, 레드햇, 젠투, * BSD 등.

6
Eelvex

파일이 /etc/debian_version이 (가) 있으며 배포가 데비안 또는 데비안 파생물입니다. 이 파일에는 릴리스 번호가있을 수 있습니다. 내 컴퓨터에서는 현재 6.0.1. 테스트 중이거나 불안정한 경우 테스트/안정적이라고 말하거나 다음 릴리스 번호가있을 수 있습니다. 내 인상은 적어도 우분투 에서이 파일은 항상 테스트/불안정하고 릴리스 번호를 넣지 않았지만 내가 틀렸다면 누군가 나를 교정 할 수 있다는 것입니다.

Fedora (최소 릴리스)는 비슷한 파일, 즉 /etc/Fedora-release.

3
Faheem Mitha

패키지가 가져 오는 종속성으로 인해 LSB 릴리스 파일을 사용할 수 없거나 사용하지 않으려는 경우 배포 판별 릴리스 파일을 찾을 수 있습니다. Bcfg2 사용할 수있는 배포판에 대한 프로브가 있습니다 : http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes /group.txt

2
jsbillings

많은 것에서 2 가지 방법 :

1) 사용

lsb_release -a

CentOS 5.5 및 Ubuntu 10.04에서 테스트했습니다.

centOS의 출력은 다음과 같습니다.

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

우분투의 경우 :

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) 다음 명령을 입력하십시오.

cat /etc/*-release

CentOS 5.5 및 Ubuntu 10.04에서 테스트했으며 정상적으로 작동합니다.

1
Sam

나는 대부분의 일반적인 리눅스 배포판에서 작동하는 좋은 스크립트 를 here 찾았습니다.

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

버전이 없으면 dist 만 :

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

누군가가 배포판을 필요로하는 경우 :

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

산출:

It is: 18.04

배포판을 얻으려면 lsb_release -sc로 변경하십시오.

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

산출:

It is: bionic
0
jturi

이것은 Ubuntu 14 및 CentOS 7에서 테스트되었습니다.

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

이 스크립트는 데비안에서 작동합니다 (우분투에서 약간의 조정이 필요할 수 있습니다)

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

screenfetch 스크립트 유틸리티를 사용합니다.

enter image description here

0
Drakonoved

여기 내 간단한 chech_distro 버전이 있습니다. ^^;

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

facter Ruby gem은 os OS에 대한 몇 가지 사실을 알려줍니다. OS 릴리스 파일, 기타 데이터를 분석하고 터미널 화면에 인쇄합니다.

# apt-get install rubygems

OS에 적합한 위의 사례를 사용하십시오. 그런 다음 gem 자체를 설치하십시오.

# gem install facter

그런 다음 사용하십시오.

$ facter

참고 : 설치에 대한 자세한 정보는 실제 gem 소스를 참조하십시오.