Bash 스크립트를 사용하여 실행중인 플랫폼이 Ubuntu 또는 CentOS인지 확인하는 방법은 무엇입니까?


39

내 컴퓨터에서 실행되는 Linux 컴퓨터의 이름을 확인하는 명령을 알고 있습니다. 예를 들면 다음과 같습니다.

우분투

cat /etc/version

CentOS

cat /etc/issue

터미널에서 출력을 가져 와서 UBUNTU 또는 CENTOS인지 확인하고 다음 명령을 수행하려면 어떻게합니까?

apt-get install updates 

또는

yum update

우분투 14.04

cat /etc/issue

답변:


53

불행히도 배포 이름을 얻는 확실한 방법은 없습니다. 대부분의 주요 배포판 /etc/os-release 이 정보를 저장 하는 데 사용되는 시스템으로 이동하고 있습니다 . 대부분의 최신 배포에는 lsb_release도구가 포함되어 있지만 기본적으로 항상 설치되는 것은 아닙니다. 사용할 수있는 방법은 다음과 같습니다.

  1. 사용하다 /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. lsb_release가능한 경우 도구를 사용하십시오

    lsb_release -d | awk -F"\t" '{print $2}'
  3. 대부분의 배포판에서 작동하는 더 복잡한 스크립트를 사용하십시오.

    # 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. gcc설치된 경우 의 버전 정보를 구문 분석하십시오 .

    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.

    우분투 12.04

    $ gcc --version
    gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
    Copyright (C) 2011 Free Software Foundation, Inc.

    우분투 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.

이것은 기본적으로 직접 @의 SLM의 위대한에서 복사 된 답변을 내 질문에 여기 .


"유감스럽게도 배포 이름을 얻는 확실한 방법은 없습니다." <— 전혀 그렇지 않습니다. 예를 들어, Sylvain Pineau 는 파이썬을 연기함으로써 현재 플랫폼 유형을 안정적으로 쿼리 하는 사소한 원 라이너를 보여주었습니다 . 쉘 스크립트는 이 답변에서 구현 된 이식 가능하지 않은 저수준 테스트로 플랫폼 메타 데이터를 수동으로 쿼리 해서는 안됩니다 .
세실 커리

Gawk는 기본적으로 데비안에 설치되어 있지 않습니다.
빌 Laitila

@VilleLaitila이 사이트는 우분투에 관한 것이므로 관련이 없습니다. 그러나 거기에 아무것도 둔한 별 여기에, 그래서 awkmawk또는 바깥 다른 구현은 단지뿐만 아니라 작동합니다.
terdon

더 구체적인 사용 lsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode

@NerdOfCode 릴리스 번호를 원한다면 lsb_release -d | awk '{print $3}'또는 grep -oP 'VERSION="\K\S+' /etc/os-release, 이중 파이프가 필요하지 않습니다.
terdon

25

당신은 이러한 작업을 수행하는 bash는 필요하지 않으며, 내가 좋아하는 파일을 다루는 피하기 위해 높은 수준의 접근 방식을 사용하는 것이 좋습니다 것 /etc/version그리고 /etc/issue(나는 13.10에 / 등 / 버전이 없습니다).

따라서이 명령을 대신 사용하는 것이 좋습니다.

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

python 플랫폼 모듈은 두 시스템 모두에서 작동하며 나머지 명령은 python에서 Ubuntu가 반환되는지 확인하고 apt-getelse를 실행 합니다 yum.


추가 -igrep5 월 도움이됩니다.
coanor

8

다음은 파일의 존재만으로 모든 버전의 Ubuntu / CentOS / RHEL에서 작동하는 간단한 답변입니다.

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

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

내 우분투에는 / etc / lsb-release가 없습니다
noonex

3
나는 -1로 가지 않을 것이지만, 적어도 하나의 경우에는이 답변이 정확하지 않습니다 : /etc/lsb-releaseCloudLinux (CentOS) 6.8에 존재하므로 yum와를 모두 리턴합니다 apt-get.
dhaupin

5

이 작업 에는 Chef 를 사용하십시오 . ;-)

Chef에서 다음 platform?방법을 사용할 수 있습니다 .

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

또는:

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

또는:

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

또는:

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

1
에 명백히 우수한 반면 낮은 수준의 쉘 중심의 취약한 비 솔루션 (예 :, lsb_release, /etc/os-release),이 솔루션은 요리사를 요구하는 별개의 단점이있다 - 프레임 워크 코드 (IAC)와 같은 헤비급 인프라를 하지 대부분의 플랫폼에 기본 및 사용을 요구하여 설치 자체 도메인 별 언어 (DSL). 즉, 대부분의 사용자는 아마 할 파이썬 연기 , 되는 쉘 스크립트와 잘 대부분 (우분투 포함) 플랫폼과 인터페이스에 기본적으로 설치.
세실 커리

5

커널 이름에서 Ubuntu를 확인하십시오.

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

배포판이 두 개 뿐인 경우 더 짧게 만들 수 있습니다.

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

어떻게 든 yum -vCentOS에서 0이 아닌 값을 반환하므로 which대신 사용하십시오 . 설치되어
있지 않은 경우 시나리오를 고려해야 which합니다.


2

다음 스크립트는 Ubuntu인지 알려야합니다. 그렇지 않고 다른 옵션이 CentOS이면 else절에 있어야합니다 .

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

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

1
lsb_release도구를 사용 하면 동일한 파일을 읽어야 할 수도 있습니다. 이 경우 또는 이 경우에 lsb_release -i보고합니다 . Distributor ID: UbuntuDistributor ID: CentOS
chronitis

@chronitis : 그렇습니다, 가능합니다
jobin

나는 그것이 기본적으로 Centos에서 사용할 수 있다고 생각하지 않습니다
Sylvain Pineau

1

/etc/os-release서브 쉘에서 실행 하고 그 값을 에코합니다 :

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

0

나는 파이썬을 사용할 것이다

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

이 명령을 사용하면 CentOS, Ubuntu 및 Debian에서 작동합니다. grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

데비안에서는 수율 Debian GNU/Linux, 우분투에서는 수율 Ubuntu, CentOS에서는 수율을 산출 CentOS Linux합니다.

gawk 대신 grep, cut 및 sed를 사용하는 이점은 분명합니다. Debian에는 기본적으로 gawk가 설치되어 있지 않으므로 임의의 Debian 상자에 의존 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.