실행중인 Linux 버전을 어떻게 알 수 있습니까?


29

때로는 스크립트가 다른 Linux에서 다르게 작동해야합니다. 스크립트가 실행중인 Linux 버전을 어떻게 확인할 수 있습니까?


1
버전별로 커널 버전을 의미합니까? 어떤 배포판? 배포판 버전?
Chris Upchurch

2
jldugger가 시스템이 실행중인 배포 제품군을 찾으려고 확신합니다. 스크립트가 일부 / sys 또는 / proc 항목에 의존하지 않는 한 커널 버전의 영향을받지 않을 것입니다. 심지어 커널보다 배포판을 기반으로하는 것이 더 쉽습니다.
Mihai Limbăşan

답변:


27

할 수있는 것과 할 수없는 것에 대한 배포판을 근거로 가정하지 마십시오. 그 방법은 광기입니다 ( "사용자 에이전트 탐지"참조). 대신, 수행하려는 작업이 지원되는지 여부와 사용하려는 명령 또는 파일 위치에 따라 수행 방법을 감지하십시오.

예를 들어, 패키지를 설치하려면 dpkg 또는 rpm이 있는지 확인하여 데비안 시스템 또는 RedHat 시스템과 같은 시스템인지 여부를 감지 할 수 있습니다 (데비안 머신은 그들에 대한 rpm 명령 ...). 데비안 시스템인지 레드햇 시스템인지가 아니라 그에 기반하여 무엇을할지 결정하십시오. 그렇게하면 명시 적으로 프로그래밍하지 않은 파생 배포판을 자동으로 지원할 수 있습니다. 아. 패키지에 특정 종속성이 필요한 경우 해당 종속성도 테스트하여 누락 된 내용을 사용자에게 알려주십시오.

또 다른 예는 네트워크 인터페이스를 다루는 것입니다. / etc / network / interfaces 파일이 있는지 또는 / etc / sysconfig / network-scripts 디렉토리가 있는지에 따라 수행 할 작업을 수행 한 다음 그 위치로 이동하십시오.

그렇습니다. 더 효과적이지만 지난 10 년 이상 웹 개발자가 저지른 모든 실수를 다시 만들고 싶지 않다면 처음부터 현명한 방법으로 할 수 있습니다.


1
(이 답변으로 확장) 경우에 따라 기능 탐지가 바람직하지만 탐지 한 기능의 분포를 절대로 추측하지 마십시오! 답을 잘못 읽지 말고 / etc에있는 파일을 기반으로 플랫폼이 RedHat인지 확인하십시오. 배포 이름이 실제로 필요한 경우 lsb_release (또는 / etc / redhat-release 등)를 확인하십시오.
Nicholas Wilson

36

교차 배포 방법이 없습니다. 하나:

  • Redhat 및 친구 : 테스트 /etc/redhat-release, 내용 확인
  • 데비안 : 테스트 /etc/debian_version, 내용 확인
  • Mandriva 및 친구들 : 테스트 /etc/version, 내용 확인
  • 슬랙웨어 : 테스트 /etc/slackware-version, 내용 확인

등 일반적 들어, 체크 말하기 /etc/*-release/etc/*-version.


편집 : 내가 몇 년 동안 함께 모여 있어야한다는 내 주위의 오래된 (1 년 이상) bash 스크립트를 찾았습니다 (6 년 동안 인상적인 CVS 로그가 있습니다) 더 이상 그대로 작동하지 않을 수 있습니다. 테스트를 위해 설치된 배포판을 찾는 데 신경 쓰지 않아도되지만 좋은 출발점을 제공해야합니다. CentOS, Fedora 및 Gentoo에서 잘 작동합니다. gyaresu 는 데비안 레니에서 성공적으로 테스트했습니다.

#!/bin/bash

get_distribution_type()
{
    local dtype
    # Assume unknown
    dtype="unknown"

    # First test against Fedora / RHEL / CentOS / generic Redhat derivative
    if [ -r /etc/rc.d/init.d/functions ]; then
        source /etc/rc.d/init.d/functions
        [ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"

    # Then test against SUSE (must be after Redhat,
    # I've seen rc.status on Ubuntu I think? TODO: Recheck that)
    elif [ -r /etc/rc.status ]; then
        source /etc/rc.status
        [ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"

    # Then test against Debian, Ubuntu and friends
    elif [ -r /lib/lsb/init-functions ]; then
        source /lib/lsb/init-functions
        [ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"

    # Then test against Gentoo
    elif [ -r /etc/init.d/functions.sh ]; then
        source /etc/init.d/functions.sh
        [ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"

    # For Slackware we currently just test if /etc/slackware-version exists
    # and isn't empty (TODO: Find a better way :)
    elif [ -s /etc/slackware-version ]; then
        dtype="slackware"
    fi
    echo $dtype
}

이것은 아마도 Bash에서만 올바르게 작동합니다. 다른 쉘을 위해 다시 작성할 수 있습니다.

즉, 배포가 아닌 기능을 테스트하려고 할 수 있습니다. 유지 보수 부담이되어 더 이상 이것을 사용하지 않습니다. 교차 배포 도구 및 솔루션을 사용하는 것이 더 쉽습니다.


개념적으로 다음과 같은 순서로 수행됩니다.

  • 알려진 "공통 초기화 스크립트 함수"유형의 파일을 가져옵니다. 배포판에 따라 다릅니다. 존재하지 않으면 다음 배포 확인으로 건너 뜁니다.
  • 알려진, 존재, 자주 사용되며 이름이 변경되지 않는 특정 핵심 스크립트가 존재하는지 확인하십시오. 우리는 typeBash 내장 을 사용하여 그렇게합니다 . 해당 기호가 함수이면를 type -t반환 function합니다. 이름이 정의되지 않으면 출력 문자열이 비어 있고 연산자의 왼손 누락에 대한 구문 오류가 발생하기 때문에 zz출력을 앞에 추가 합니다 . 방금 확인한 이름이 함수가 아닌 경우 다음 배포 확인으로 건너 뛰십시오. 그렇지 않으면 배포 유형을 찾았습니다.type -t 2>/dev/null==
  • 마지막으로, 배포 유형을 에코하여 함수 출력을 .. esac 블록에서 쉽게 사용할 수 있도록합니다.

이 스크립트를 직선 스크립트로 실행하려는 경우 편집하십시오.이 스크립트는 다른 스크립트에서 소스로 제공되거나 포함되어야합니다. 그대로 실행하면 자체적으로 아무것도 출력하지 않습니다. 테스트하려면 소스를 작성한 다음 함수를 호출하십시오. 예 :

source /path/to/this/script.sh
get_distribution_type

bash 프롬프트에서.


편집 :이 스크립트에는 루트 권한이 필요하지 않습니다. 루트로 실행하지 말 것을 권한다. 아무것도 해치지 않아야하지만 필요는 없습니다.


CVS 로그에서 관련 메일 링리스트 게시물 에 대한 링크를 찾았습니다 . 초기화 스크립트 스파게티를 풀 때 유용합니다.


나는 왜 그런지 보지 않았지만 데비안 레니 (5.0)에 프롬프트로 돌아갑니다.
Gareth

gyaresu, 실제로 get_distribution_type 함수를 호출 했습니까? 나는 명확하게 포스트 편집 한 (하단에 참조.)
미하이 Limbăşan을

@ gyaresu : 위의 문제가 아닌 경우 데비안 섹션의 log_begin_msg를 log_warning_msg로 바꾸고 다시 시도 할 수 있습니까? 기능 이름이 잘못되었을 수 있습니다. 어쨌든, 그 함수가 방해받지 않았지만 여전히 "알 수 없음"을 반환했을 것입니다.
Mihai Limbăşan

@Mihai Doh! 죄송합니다. 스크립트를 제대로 읽지 못했습니다. 일찍 커피가 없었습니다. 사과드립니다 gyaresu @ debian : ~ / bin $ 소스 server_version.sh gyaresu @ debian : ~ / bin $ get_distribution_type 데비안
Gareth

@ 갸 레스 : 감사합니다! 좋습니다, jldugger가 데비안에서도 작동한다는 것을 알도록 도와주십시오 :)
Mihai Limbăşan

17

당신은 실행하여 커널 버전을 찾을 수 있습니다 uname -a배포판 버전을 찾는 것은, 배포판에 따라 달라집니다.

우분투와 다른 OS에서는 lsb_release -a/ etc / lsb_release를 실행 하거나 읽을 수 있습니다

데비안은 / etc / debian_version에 버전을 저장합니다


lsb_release의 경우 +1 (적절한 패키지가 설치된 경우 Red Hat 파생 상품에도 적용됨)
Josh Kelley

설명 'lsb_release -ds'에 대해서만 설명합니다.
flickerfly

6

대부분의 배포판에는 특정 분포를 결정하는 고유 한 방법이 있습니다.

예를 들면 다음과 같습니다.

Redhat (And derivatives): /etc/redhat-release

SUSE: /etc/SUSE-release

Linux Standard Base 또는 LSB 로 알려진 표준이 있습니다 . / etc / lsb-release라는 파일이나 lsb_release라는 프로그램이 있어야 리눅스 배포판에 대한 정보를 되돌릴 수 있습니다.

lsb_release -a

물론 lsb_releaseCentOS 6에는 존재하지 않습니다.
Justin Justin


5

다른 답변 외에도 : 하나의 파일을 구문 분석하려면 / etc / issue를 통해 tty 로그인을 개인화하십시오.

SUSE Linux Enterprise Server 10 SP2 (i586)-커널 \ r (\ l)에 오신 것을 환영합니다.

그리고 네, 그것이 차선책이라는 것을 압니다. :)


차선책 일 수도 있지만 같은 위치에 있습니다.
브래드 길버트

4

facter 는 이러한 종류의 검색에 유용한 도구이지만 위에 자세히 설명 된 방법 중 일부를 사용하고 Ruby가 필요합니다.


2

uname -a좋아하는 껍질에 입력 하기 만하면됩니다. 커널 이름과 버전이 출력됩니다.


2

나는 cat /etc/*release*거의 항상 작동 한다는 것을 알았습니다 .


2

마크, 아담, 미하이와 동의합니다 (불충분 한 평판으로 인해 투표 할 수 없습니다). LSB 및 관련 FHS 기반 솔루션 은 대부분의 배포에서 작동하며 앞으로도 계속 작동 할 것입니다. LSB와 FHS는 당신의 친구입니다.


2

당신은 또한 버전을 얻을 수 있습니다

cat /proc/version

o / p :

Linux 버전 2.6.17-13mdv (rtp@octopus.mandriva.com) (gcc 버전 4.1.2 20070302 (시험판) (4.1.2-1mdv2007.1)) # 1 SMP Fri 3 월 23 일 19:03:31 UTC 2007


1

리눅스 버전은 어려운 질문이다. 우리가 좁게 살펴보면 " uname -r"로 얻을 수있는 커널 버전이 있습니다 . 배포판은 대부분 부도덕하다. 일부 배포판이 더 좋습니다 (Redhat Enterprise Linux와 같은 엔터프라이즈 배포판). 젠투와 같은 다른 배포판은 기본적으로 합리적인 버전이없는 움직이는 대상입니다. 버전을 기반으로해야 할 일과 관련이있는 주요 구성 요소를 살펴보십시오.

Component       Version command
glibc           /lib/libc.so.6
gcc             gcc --version
X               xdpyinfo
libX11          pkg-config --modversion x11
gtk+            pkg-config --modversion gtk+-2.0
qt-4            pkg-config --modversion QtCore

   etc...

1

당신은 또한 Grub 메뉴를 확인할 수 있습니다, 일반적으로 당신에게 많은 배포판 / 버전 정보를 제공합니다 :-)


-1

FusionInventory 는 여러 Linux 배포판뿐만 아니라 BSD, Windows, MacOS X 및 기타 유니스에서도이 정보를 얻을 수있는 크로스 플랫폼 경량 인벤토리 도구입니다.

사용 가능한 경우 lsb_release(위에서 몇 번 언급했듯이) 사용 하지만, 그렇지 않은 경우 배포 이름 및 버전을 확인하기위한 매우 유용한 파일 및 정규식 목록이 있습니다. https://github.com/fusinv/fusioninventory-agent/ blob / 2.2.x / lib / FusionInventory / Agent / Task / Inventory / Input / Linux / Distro / NonLSB.pm # L16 .

커뮤니티에서이 기능을 최신 상태로 유지하므로이 논리를 사용하여 스크립트를 다시 구현하는 대신 FusionInventory 자체를 사용하여이 정보를 얻는 것이 좋습니다. 에이전트를 자체적으로 사용하거나 (파싱하기 쉬운 XML / JSON 파일을 출력 함) 필요에 따라 GLPI 또는 Rudder 와 같은 네트워크의 시스템을 관리하기 위해 더 넓은 솔루션과 결합 할 수 있습니다 .


이것은 Perl 모듈의 외부 의존성이 없다면 좋은 솔루션이 될 것입니다
Will Sheppard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.