리눅스 배포판 결정


11

어떤 Linux 서버 버전이 실행되고 있는지 확인하려고합니다. 커널 버전을 결정하려는 것이 아니라 배포자를 평가하는 것입니다.

gcc가 설치되고 버전 출력에 RedHat라고 표시됩니다.

# gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11)

이것은 내 서버가 RedHat 서버라고 안전하게 가정 할 수 있음을 의미합니까? 이것을 알아내는 더 나은-100 % 방탄 방법이 있습니까? 이 서버뿐만 아니라 다른 리눅스 버전도 마찬가지입니다.

편집 : /etc/도움 이 되는 경우의 내용 이지만 다른 버전의 Linux에서도 작동하는 솔루션을 원합니다.

# ls /etc/
./              backupmxhosts  domainusers     host.conf     localdomains  mailips        pam.d/      relayhosts               shadow              trustedmailhosts
../             bashrc*        exim.conf       inputrc       localtime     man.config     passwd      resolv.conf              skipsmtpcheckhosts  userdomains
DIR_COLORS      cron.deny      exim.pl         ld.so.cache   lynx.cfg      mtab           profile     secondarymx              spammeripblocks     vimrc
aliases         demodomains    exim.pl.local*  ld.so.conf    mail/         my.cnf         profile.d/  senderverifybypasshosts  sudoers
antivirus.exim  demouids       group           localaliases  mailhelo      nsswitch.conf  protocols   services                 termcap

나는 더없는 *release또는 *version파일을/etc/

# ls /etc*release; ls /etc/*version
/bin/ls: /etc/*release: No such file or directory
/bin/ls: /etc/*version: No such file or directory

나는 LSB를 시도

# lsb_release -a
LSB Version:
Distributor ID: n/a
Description:    (none)
Release:        n/a
Codename:       n/a

또한-나는 chroot jail이 문제의 원인이 될 수 있는 (실제로 확실하지 않은) 내부에 있다고 생각 합니다.


업데이트 :

나는 이것이 나를 위해 그것을 생각합니다. 나는 cent-os를 사용하고 있다고 가정 할 수 있다고 생각합니다.

# cat /proc/version
Linux version 2.6.9-103.plus.c4smp (mockbuild@builder10.centos.org) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)) #1 SMP Wed Dec 21 16:17:23 EST 2011

왜 알아야합니까? 대신 일반적인 배포 관련 도구 (예 : 패키지 관리자)를 테스트하면 원하는 작업을 수행 할 수 있습니까?
Daniel Pryden

1
실제로 알고 싶은 것은 서버를 로컬로 가상 머신으로 복제 한 다음 로컬 가상 머신에 설치 한 다음 바이너리를 원격 머신으로 복사 할 수 있는지 여부입니다. 올바른 플랫폼을 찾는 것이 좋은 출발점이 될 것이라고 생각했습니다.
Billy Moon

2
위의 디렉토리 목록이 불완전합니다 (예 : 호스트 누락, init.d, rc *). 이것은 테스트입니까?

이 서버에 어떻게 접근하고 있습니까? 서버의 파일 시스템에 직접 액세스 할 수는 없지만 chroot jail 안에있을 수 있습니까?
Daniel Pryden

나는 chroot jail 안에있을 수 있다고 생각합니다-이것이 기본 시스템이 무엇인지 알 수 없다는 것을 의미합니까?
Billy Moon

답변:


4
cat /proc/version

예 :

  1. 우분투 :

    $ cat /proc/version
    Linux version 3.11.0-13-generic (buildd@roseapple) (gcc version 4.8.1 \
    (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013
    
  2. 레드햇 / CentOS :

    $ cat /proc/version
    Linux version 2.6.32-220.13.1.el6.x86_64 (mockbuild@c6b6.bsys.dev.centos.org) \
    (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Apr 17 23:56:34 BST 2012
    

사용중인 Linux 배포판을 확인하는 방법 도 참조하십시오 .


이것은 배포본이 아니라 커널이 컴파일 된 위치를 보여줍니다. 대부분의 경우 커널은 동일한 배포판에서 이전 버전으로 컴파일됩니다.
pabouk

13

대부분의 최신 Linux 배포판에서 다음 명령은 정보를 제공합니다.

lsb_release -a

1
아니요, 사실이 아닙니다. 이것은 데비안과 파생물에 대해서만 작동합니다
MariusMatutiae

1
이 명령은 기본적으로 Red Hat 및 파생 제품 (예 : CentOS)에 설치되지 않습니다. 사용하기 전에 명시 적으로 설치해야합니다 yum install redhat-lsb-core..
pabouk

@MariusMatutiae 실제로는 그보다 훨씬 광범위하지만 항상 기본적으로 설치되는 것은 아닙니다.
terdon

@ terdon 감사합니다, 나는 몰랐습니다.
MariusMatutiae

@MariusMatutiae 자세한 내용은 여기 를 참조 하십시오. SuSe에는없는 것 같지만 RH에 설치해야합니다.
terdon

9

/etc/issue 좋은 출발점이 될 수 있습니다.

정보 파일에서 다른 배포판을 검사하면 더 많은 것을 찾을 수 있습니다.

Novell SuSE    /etc/SuSE-release
OpenSuSE       /etc/SuSE-release, /etc/os-release
Red Hat,CentOS /etc/redhat-release, /etc/redhat_version
Fedora         /etc/fedora-release, /etc/redhat-release, /etc/os-release
Slackware      /etc/slackware-release, /etc/slackware-version
Debian         /etc/debian_release, /etc/debian_version
Mandrake       /etc/mandrake-release
Yellow dog     /etc/yellowdog-release
Sun JDS        /etc/sun-release 
Solaris/Sparc  /etc/release 
Gentoo         /etc/gentoo-release
Amazon Linux   /etc/system-release
PLD Linux      /etc/pld-release, /etc/os-release
ArchLinux      /etc/arch-release, /etc/os-release

자세한 내용은 유닉스 포럼 을 참조하십시오.


1
불행히도 나는 끝나 release거나 versionetc디렉토리 에 파일이 없습니다
Billy Moon

4

/etc/issue누락 된 경우 하나 이상의 /etc/*_release파일 이있을 수 있습니다 .

예를 들어, 우분투 시스템에는 /etc/lsb-release다음 이 있습니다 .

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.04
DISTRIB_CODENAME=natty
DISTRIB_DESCRIPTION="Ubuntu 11.04"

친구의 CentOS 시스템 (Red Hat 기반)에는 /etc/redhat-release다음 이 있습니다 .

CentOS release 5.6 (Final)

이것이 얼마나 보편적인지 모르겠습니다.


어떤 release또는 version내에서 파일/etc/
빌리 달

@BillyMoon Linux 배포판이 배포판에 lsb_release 유틸리티를 추가하기 시작한 것은 최근에야 믿습니다. lsb_release -a
Alpha01

팁 주셔서 감사합니다-불행히도 이번에는 도와주지 않습니다
Billy Moon

2

cat / etc / issue가 귀하의 질문에 답변 할 수 있습니다.

배포판 제작자들은 당신에게 친절하지 않습니다. 첫째, 각자는 그것이 유일한 유일한 방법이라고 생각합니다.

아마도 배포판을 스니핑하려고하는 대신 실제로 대답 해야하는 특정 질문을 더 자세히 살펴 봐야합니다. 배포판이 아닌보고있는 기능에 중점을 둡니다. 결국, 새로운 버전의 배포판은 특정 축에서 반대 방향으로 돌아갈 수 있습니다.


3
/etc/issue내 서버 에는 없습니다
Billy Moon

예. 주 /etc/issue와 같은 이스케이프 시퀀스를 포함 할 수있다 \n\l. 어떤 이들은 평균 참조하십시오 man 5 issueman getty합니다 ( /etc/issue파일이 주로 사용하기위한 것입니다 getty). 물론 시스템 소유자는 /etc/issue사악한 이유로 편집 할 수 있습니다.
Keith Thompson

/etc/issue존재하거나 배포 공급 업체에 대한 정보를 포함 할 필요 는 없다고 생각 합니다. 그것은 일반적으로하지만 당신이 그것에 의존 할 수 있다고 생각하지 않습니다.
Daniel Pryden

@DanielPryden 매일 매일 무언가를 배웁니다. 나는 한 번도 나 자신의 부재에 빠지지 않았다.
bmargulies

1

사용하십시오 facter(맞춤법이 맞습니다).

Facter는 꼭두각시의 동반자이며 시스템에 대한 정보를 포함하는 쿼리 할 수있는 변수를 제공합니다.

예를 들어, 요인이 반환 할 수있는 수십 가지 변수는 다음과 같습니다.

$ facter
...
operatingsystem => CentOS
operatingsystemmajrelease => 6
operatingsystemrelease => 6.4
osfamily => RedHat
...

osfamily 사실을 쿼리하여 서버가 RedHat을 실행하고 있는지 확인할 수 있습니다.

$ facter osfamily
RedHat

설명서를 확인하십시오 : http://puppetlabs.com/facter


0

uname -a

모든 Tux에 항상 작동


1
커널 버전 문자열을 보고 합니다. 호스트가 베어 메탈 또는 OpenVZ 또는 VServer와 같은 도구로 인해 다른 배포판에서 커널을 실행하는 경우 매우 잘못 될 수 있습니다.
sarnold

네,하지만 난에 가정 떨어지게을 알 Q의 경우 저자. 상황에 대해. "외국인"커널은 다소 이상한 경우
Lazy Badger

0

이 작업을 수행하는 확실한 확실한 방법은 없습니다. 나는 unix.se 에 대해 비슷한 질문했고이 정보를 얻는 가장 좋은 방법은 다양한 소스를 확인하는 스크립트입니다.

#!/bin/sh
# Detects which OS and if it is Linux then it will detect which Linux
# Distribution.

OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`

GetVersionFromFile()
{
    VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}

if [ "${OS}" = "SunOS" ] ; then
    OS=Solaris
    ARCH=`uname -p` 
    OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
elif [ "${OS}" = "AIX" ] ; then
    OSSTR="${OS} `oslevel` (`oslevel -r`)"
elif [ "${OS}" = "Linux" ] ; then
    KERNEL=`uname -r`
    if [ -f /etc/redhat-release ] ; then
        DIST='RedHat'
        PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/SuSE-release ] ; then
        DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
        REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
    elif [ -f /etc/mandrake-release ] ; then
        DIST='Mandrake'
        PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/debian_version ] ; then
        DIST="Debian `cat /etc/debian_version`"
        REV=""

    fi
    if [ -f /etc/UnitedLinux-release ] ; then
        DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
    fi

    OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"

fi

echo ${OSSTR}

다른 선택은 실제로 특정 배포판을 위해 컴파일 gcc --version되기 때문에 실제로 사용하기 때문에을 사용 gcc합니다. 나는 U & L에서 내 질문에 대한 대답 을 읽는 것이 좋습니다. 그것은 상황을 아주 잘 설명합니다.


0

이 명령은 데비안 기반 배포본과 Redhat 기반 배포판에서 작동했습니다. tr 필터를 사용하면 문서를 한 줄에 한 단어 형식으로 변환 한 다음 배포 이름이 포함 된 첫 번째 줄을 계산합니다.

tr -s ' \011' '\012' < /etc/issue | head -n 1

-1

토스가 가장 좋은 방법입니다

cat /etc/*release

질문에 내 /etc디렉토리를 나열했습니다 . 다른 답변에서 논의 했듯이이 솔루션은 저에게 효과적이지 않습니다.
Billy Moon

U는 ls / etc * release를 시도했습니다. . 그건 잘못 됐어. ls / etc / * release를 시도하십시오. 그것은 확실히 작동합니다
Unnikrishnan

나는 또한 /etc/디렉토리 에서 ls를 했고 거기에 파일이 없다는 것을 알 수있다release
Billy Moon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.