운영 체제 이름을 안정적으로 얻으려면 어떻게해야합니까?


69

원격 시스템에 로그인했다고 가정합니다. 실행중인 시스템을 어떻게 알 수 있습니까? 대부분의 최신 Linux (Linuces?)에는 다음 lsb_release명령이 있습니다.

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

내가 알 수있는 한와 같은 정보를 제공합니다 /etc/lsb-release. 해당 파일이 없으면 어떻게합니까? lsb_release명령이 상대적으로 새롭다는 것을 기억하는 것 같습니다 . 이전 시스템의 OS를 가져와야한다면 어떻게해야합니까?

어떤 경우 lsb를 의미 Linux Standard Base그래서 그것을 비 리눅스 유닉스에서 작동하지 않습니다 가정입니다. 내가 아는 한,이 정보를 얻는 uname방법이 없으므로 사용하지 않는 시스템에서 어떻게 얻을 수 lsb_release있습니까?


1
Linux의 경우 unix.stackexchange.com/questions/6345/… uname -s리눅스 외부에 충분해야한다 (BSD에 대한 예상).
Mat

체크 아웃 facter했습니까? facter operatingsystem모든 시스템 facter에서 원하는 작업을 수행해야합니다.
Joseph R.

@JosephR. 좋아 보이지만 기본적으로 설치되어 있지 않습니다.
terdon

1
facterpastebin에 운영 체제 이름을 얻는 코드를 붙여 넣었습니다 . 여기에서 찾으 십시오 . 이름을 안정적으로 얻기 위해 많은 다른 파일을 검사합니다.
Joseph R.

@JosephR. 와우, 그것은 많은 파일입니다. 나는 기회가 생길 때 그것을 bash로 포팅 할 것이다. 감사!
terdon

답변:


72

lsb_release -a 이 정보를 찾고 일관된 방식으로 수행 할 수있는 최선의 선택이 될 것입니다.

LSB의 역사

lsb명령은 Linux Foundations 가 후원 하는 다양한 프로젝트 인 Linux Standards Base 프로젝트를 나타내며 다양한 Linux 배포판에서 기본적인 작업을 수행하는 일반적인 방법을 제공합니다.

이 프로젝트는 자발적이며 벤더는 사용자로서 그리고 다른 Linux 배포판 내에서 표준화를 추진하는 데 도움이되는 다양한 모듈에 대한 다양한 사양의 촉진자로서 프로젝트에 참여할 수 있습니다.

헌장 에서 발췌

LSB 작업 그룹은이 두 가지 관심사를 해결하기위한 핵심 목표입니다. 주요 배포 공급 업체와상의하여 배포에서 지원해야하는 최소 API 세트를 설명하는 표준을 게시합니다. 또한 표준에 대한 지원을 측정하는 테스트 및 도구를 제공하고 응용 프로그램 개발자가 공통 집합을 대상으로 할 수 있습니다. 마지막으로, 우리의 테스트 작업을 통해 배포판 사이에 불필요한 발산을 방지하려고합니다.

LSB와 관련된 유용한 링크

비판

LSB에는 데비안과 같은 배포판에 문제를 일으키는 여러 가지 문제가 있습니다. RPM의 강제 사용은 하나입니다. 이 문제에 대한 자세한 내용은 Wikipedia 기사를 참조하십시오 .

노벨

검색하면 Novell에서 기본 Linux 배포판 감지 라는 제목의 상당히 오래된 페이지가 표시 될 수 있습니다 . 이것은 몇 가지 주요 배포판과 사용중인 기본 배포판을 감지하는 방법을 보여주는 실제 목록을 보았던 몇 가지 장소 중 하나입니다.

발췌

Novell SUSE         /etc/SUSE-release
Red Hat             /etc/redhat-release, /etc/redhat_version
Fedora              /etc/fedora-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
UnitedLinux         /etc/UnitedLinux-release
ubuntu              /etc/lsb-release

이 페이지에는 바닐라 uname명령 만 사용하여 위의 코드를 작성하려고 시도하는 편리한 스크립트 와 위의 파일 중 하나가 포함되어 있습니다.

참고 : 이 목록은 날짜가 있지만 Mandrake와 같은 날짜가 지정된 배포판을 목록에서 쉽게 삭제하고 다른 것으로 대체 할 수 있습니다. 이 유형의 스크립트는 방대한 양의 Solaris 및 Linux 변형을 지원하려는 경우 접근 방식 중 하나 일 수 있습니다.

리눅스 마피아

더 많은 검색은 Linuxmafia.com에서 다음과 같은 페이지를 유지합니다. 제목은 sundry Linux (및 기타 Unix) 배포판에 해당하는 / etc / release와 같습니다 . 이것은 내가 본 것 중 가장 철저한 목록 일 것입니다. case / switch 문으로이 목록을 체계화하고이를 소프트웨어 배포의 일부로 포함시킬 수 있습니다.

실제로 해당 페이지의 맨 아래에는 정확히 그렇게하는 스크립트가 있습니다. 따라서 소프트웨어 배포판의 타사로 스크립트를 다운로드하여 사용할 수 있습니다.

스크립트

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

참고 : 이 스크립트는 익숙해 보일 것입니다. Novell의 최신 버전입니다!

레그룸 스크립트

내가 본 또 다른 방법은 위의 Novell 방법과 비슷하지만 LSB를 대신 사용하여 자신의 스크립트를 롤링하는 것입니다. 이 기사 제목 : Linux (또는 UNIX) 배포 이름을 결정하는 일반적인 방법 은 이러한 방법 중 하나를 보여줍니다.

# 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

이 코드 덩어리는 시스템 /etc/bashrc이나 그와 같은 파일에 포함되어 환경 변수를 설정할 수 있습니다 $DISTRO.

gcc

믿거 나 말거나 다른 방법을 사용하는 것입니다 gcc. 명령을 쿼리하면 gcc --versiongcc가 빌드 된 배포판을 얻습니다. 이것은 실행중인 시스템과 거의 동일합니다.

페도라 14

$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.

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.

TL; DR;

어떤 것을 사용해야합니까? lsb_release -a자주 사용하는 Linux 배포판 (RedHat, Debian, Ubuntu 등)을 사용 하는 경향이 있습니다. 제공하지 않는 시스템을 지원하는 상황에서는 lsb_release위의 스크립트 중 하나와 비슷하게 내가 제공하는 소프트웨어 배포의 일부로 나 자신을 굴려야합니다.

업데이트 # 1 : SuSE 후속 조치

아래의 의견에서 @Nils와 이야기하면서 SLES11은 LSB가 기본적으로 설치되지 않는 것으로 나타났습니다. 이것은 선택적 설치 일 뿐이며, 이러한 유형의 주요 기능을 제공하는 패키지와 반대되는 것으로 보입니다.

그래서 OpenSuSE 프로젝트에서 누군가에게 연락하여 그 이유를 알 수있는 기회를 얻었습니다.

이메일 발췌

Hi Rob,

I hope you don't mind me contacting you directly but I found your info here: 
https://en.opensuse.org/User:Rjschwei. I participate on one of the StackExchange 
sites, Unix & Linux and a question recently came up regarding the best option 
for determining the underlying OS.

http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name/92218?noredirect=1#comment140840_92218

In my answer I suggested using lsb_release, but one of the other users mentioned 
that this command wasn't installed as part of SLES11 which kind of surprised me. 
Anyway we were looking for some way to confirm whether this was intentionally 
dropped from SLES or it was accidental.

Would you know how we could go about confirming this one way or another?

Thanks for reading this, appreciate any help and/or guidance on this.

-Sam Mingolelli
http://unix.stackexchange.com/users/7453/slm

Rob의 답변입니다

Hi,

On 10/01/2013 09:31 AM, Sam Mingo wrote:
- show quoted text -

lsb_release was not dropped in SLES 11. SLES 11 is LSB certified. However, it 
is not installed by default, which is consistent with pretty much every other
distribution. The lsb_release command is part of the lsb-release package.

At present almost every distribution has an entry in /etc such as 
/etc/SuSE-release for SLES and openSUSE. Since this is difficult for ISVs and 
others there is a standardization effort going on driven by the convergence to 
systemd. The standard location for distribution information in the future will 
be /etc/os-release, although Ubuntu will probably do something different.

HTH,    
Robert

--  Robert Schweikert                           MAY THE SOURCE BE WITH YOU    
SUSE-IBM Software Integration Center                   LINUX    
Tech Lead    
Public Cloud Architect 

1
참고 : AIX 및 SunOS가있는 시스템에서 빠른 점검을 수행했습니다. 그들은 lsb_release를 설치하지 않은 것 같습니다 (그리고 결국 이것은 Linux 스택이 아닌 Unix입니다). gcc의 문제점은 이제 일부 ppl이 clang을 사용하기 시작한다는 것입니다. 또한 어떤 gcc가 빌드에 사용되었는지 확신 할 수 없습니다 (필요한 버전은 각각 작동하는 시스템에서). 그래서 기본적으로 지금 어디에나 설치되어있는 것처럼 Python 솔루션에 투표합니다.
elmo

@elmo-예 LSB는 Linux Standard Base이므로 AIX 또는 SunOS가이를 기대하지는 않습니다. SunOS에 대한 나의 경험은 15 년 이상이며, 내가 다루는 대부분의 공급 업체는 일반적으로 위에서 언급 한 것과 유사한 자체 쉘 스크립트를 제공합니다. Solaris 11까지는 Python이 옵션이 아니 었습니다. 그리고 이것이 깨지기 어려운 너트입니다. Solaris 9, 10, 11, AIX 및 Linux 배포판 (SUSE, Ubntu 및 RHEL)에서 실행해야하는 소프트웨어를 제공하는 경우 어떻게해야합니까? 파이썬은 옵션이 아니므로 직접 코딩 한 쉘 스크립트가 남아 있습니다.
slm

@elmo-gcc는 옵션이지만 나에게 호소력이있는 것으로 보이지 않습니다. 너무 많은 문제가 있었기 때문에 옵션으로 만 시연했습니다.
slm

@elmo-해당 함수 뒤에있는 코드 인 hg.python.org/cpython/file/2.7/Lib/platform.py#l259을보십시오 . LSB를 사용하고 있다는 것이 놀랍습니다!
slm

@ slm : SunOS 5.10 (귀하의 목록에 10이라고 가정합니다-Sun의 버전 번호 / 수집에 익숙하지 않습니다)이있는 컴퓨터에 액세스 할 수 있으며 Python이 있습니다. AIX 7이 설치된 머신에 액세스 할 수 있으며 Python이 있습니다. 리눅스 머신에도 분명히 있습니다. 여전히 파이썬은 가장 이식성이 좋은 선택처럼 보입니다. 10 미만의 Sun의 경우 왜 Python을 설치할 수 없는지 잘 모르겠습니다 (확실히 현재 설치에 ncurses 및 ctype이 없으므로 알 수 있습니다). LSB를 사용하는 Python의 경우 기본 접근 방식 인 경우 Linux에서는 전혀 놀라운 일이 아닙니다.
elmo

16

facter원격 서버에 설치할 수 없으므로 OS 이름을 찾기 위해 수행하는 작업을 모방 할 수 있습니다. operatingsystem사실에 대한 루비 코드는 pastebin 에서 찾을 수 있습니다 . 기본적으로 *-releaseOS 이름을 결정하기 위해 다른 파일과 다른 파일을 살펴 봅니다 .

보이는 파일 중 일부 :

/etc/debian_version
/etc/gentoo-release
/etc/fedora-release
/etc/mandriva-release
/etc/mandrake-release
/etc/meego-release
/etc/arch-release
/etc/oracle-release
/etc/enterprise-release
/etc/ovs-release
/etc/vmware-release
/etc/redhat-release
/etc/SuSE-release
/etc/bluewhite64-version
/etc/slamd64-version
/etc/slackware-version
/etc/alpine-release
/etc/system-release
/etc/centos-release

이 목록에서 중복 된 부분을 찾으면 죄송합니다 grep. 이것을 POSIX 쉘 스크립트로 포팅하기는 꽤 쉬워야한다.


5
"이 목록에서 중복 된 부분을 발견하면 죄송합니다. grep을 사용하여 빠르게 생성했습니다." ... | uniq?
new123456

@ new123456 맞습니다. 감사. 여기서 핵심 단어는 "신속하게"입니다.
Joseph R.

이것을 받아들이는 것에 대해 죄송하지만 @slm의 대답은 무시하기에는 너무 포괄적입니다. :).
terdon

3
/ etc / os-release는 어떻습니까?
Yauhen Yakimovich

1
@ new123456 기술적으로는이어야합니다 ... | sort -u. uniq인접한 고유 한 요소 만 찾습니다.
Parthian Shot

9

경우에 당신은 python, 당신은 유통 이름을 찾을 수 있습니다 (파이썬 3 파이썬이 있는지 여부는 중요하지 않습니다) 설치 바퀴를 개혁하지 않고 :

python -c "import platform;print(platform.linux_distribution()[0])"

이 옵션을 사용하려는 유혹이 있다면 OS가 지원되는지 확인하십시오 : hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . 그렇지 않은 경우 목록에 더 추가 할 수 있습니다 : coderwall.com/p/cwrenq
slm

1
고대 Linux 배포에서는 작동하지 않습니다. 예 : SuSE 7.0에는 Python 1.5.2가 있고 2003 년에 Python 2.3이
출시

6

/etc/issue릴리스 정보를 포함해야합니다. 솔라리스 시스템에서 본 적이 있습니다. 최신 데비안 시스템의 파일은 다음과 같습니다.

$ cat /etc/issue
Debian GNU/Linux 7 \n \l

$ 

/ etc / issue 는 "선택적"이지만 FHS (Linux 시스템에만 해당되지 않음 )에도 언급되어 있습니다.


아, 그건 좋은 제안입니다, +1. 항상 작동하지는 않지만 The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.sysadmin이 원하는 것을 작성하는 것은 시스템 관리자의 몫입니다.
terdon

2
/etc/issue완전히 신뢰할 수 없습니다. ( /etc/issue나쁜 패치 관리에 따라 YZ라는 배너가 있는 버전 XY의 시스템을 보았습니다 . 절대적으로 무엇이든 포함 할 수 있습니다.)
Mat

해당 파일을 채우는 것이 좋습니다. 누가 로그인이 허용되는지와 같은 법적 내용.
Nils

보안 지침 및 감사자가 권장합니다. / etc / issue에 오신 것을 환영합니다
Nils

@drewbenn man 페이지는 첫 번째 주석에서 인용 한 내용을 말하지만 시스템 정보를 포함해야 할 필요성은 없습니다. 그것은 종종 그렇습니다.
terdon

6

모든 배포판에서 단일 명령으로 배포판 이름을 안정적으로 가져올 수 없습니다. 일부는 / etc / *-release를 통해 사용 가능하고 다른 일부는 'lsb-release'명령을 통해 사용 가능합니다.


고맙지 만 Unix 나 다른 비 Linux * nix에 대해서는 도움이되지 않습니다.
terdon

3

이 쉘 명령을 사용하여 Linux 배포를 나타내는 문자열을 얻었습니다.

for f in $(find /etc -type f -maxdepth 1 \( ! -wholename /etc/os-release ! -wholename /etc/lsb-release -wholename /etc/\*release -o -wholename /etc/\*version \) 2> /dev/null); do echo ${f:5:${#f}-13}; done;

이 명령은 Joseph R.과 slm의 답변을 기반으로합니다.

/ etc / {osname} -release 또는 / etc / {osname} _version과 같은 파일을 찾고 특정 OS 이름을 인쇄합니다.

그것은 일했다

  • CentOS (센 토스)
  • 레드햇 (redhat)
  • 데비안 (debian)
  • 아치 (arch)
  • OpenSUSE (OpenSUSE)
  • 페도라 (페도라)
  • 우분투 (데비안)

for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; done그들 모두에서 똑같이 잘 작동 하지 않습니까? 에있는 find모든 파일을 먼저 사용해야하는 이유를 모르겠습니다 /etc.
terdon

귀하의 의견에 감사드립니다. terdon, 그러나 귀하의 명령은 적어도 Cent OS 및 Fedora에서 0 줄을 제공합니다
scrutari


1

SNMP 는 다양한 종류의 GNU / Linux 배포판과 UNIX 시스템에서 찾을 수있는 유비쿼터스 충분한 프로토콜입니다.

대상 시스템에 SNMP 데몬이 실행중인 system.sysDescr.0경우 SNMPv2-MIB 의 개체를 사용하여 연락중인 OS를 찾을 수 있습니다.

기술

엔터티에 대한 텍스트 설명입니다. 이 값에는 시스템 하드웨어 유형, 소프트웨어 운영 체제 및 네트워킹 소프트웨어의 전체 이름 및 버전 식별이 포함되어야합니다.

상태 : 현재

액세스 : 읽기 전용

snmpget(1)맨 페이지 예제와 함께이 값을 검색하는 방법을 설명합니다.


단점은 이것이 자동으로 유지되지 않는 정적 문자열이라는 것입니다.
Nils

1

일반적인 방법은 없기 때문에 snmp exec-command를 통해 release-string을 정의했습니다.

해당 명령의 작업은 배포판과 현재 주 / 부 버전의 OS를 인쇄하는 것입니다.

RH와 클론에서는 SuSe SuSe-release에서 / etc / redhat-release를 구문 분석합니다.


'우리'는 누구입니까? 그리고 유닉스는 어떻습니까?
terdon

@terdon 우리는 직장에서 우리 팀입니다. Unix에서는 해당 확장자가 snmpd로 컴파일 된 경우에도 동일한 작업을 수행 할 수 있습니다.
Nils

아, 나는 당신이 일부 표준 그룹의 일부라고 생각했습니다 :)
terdon

@terdon 80 대 이상의 서버를 관리해야 할 때 사이트 표준 개발을 시작합니다. 우리는이 방법을 개발하여 운영 체제가 구식인지 (EoL 부 또는 주요 수) 모니터링 할 수 있습니다
Nils

1

내가이 스레드에서 수집 한 것에서 다음을 사용하여 모든 시스템에서 정보를 얻을 수 있어야합니다.

if which lsb_release &>> /dev/null; then
    lsb_release -a
elif [ -r /etc/issue ]; then
    cat /etc/issue
else
    ls /etc/ | grep -e '[_-]release$' -e '[_-]version$' | xargs -I % -n 1 cat /etc/%
fi

2
ls의 출력을 구문 분석하지 마십시오!
heinrich5991

왜 안돼?
Sammitch

기술적으로 그는의 출력을 구문 분석하지 않습니다 ls. 그는의 렉싱 의 출력을 ls. 그러나 그래 ... 이것은 /etc/issue완전히 신뢰할 수 없기 때문에 잘못 되었습니다. 완전히, 완전히, 완전히 신뢰할 수 없습니다. 또한 아무도 'release'또는 'version'으로 끝나는 비 OS 관련 파일을 넣을 수 없다는 가정은 현명하지 않습니다.
Parthian Shot

@ParthianShot 따라서 보다 안정적인 옵션 을 사용할 수없는 경우 주로 두 번째 및 세 번째 수준의 폴백에 대해 불평하고 싶 습니까?
Sammitch

@Sammitch more reliable options글쎄, 한 가지 옵션은 하나뿐입니다. 그래서 나는 그것이 더 신뢰할 만하다는 가정에 동의한다고 가정하더라도, 나는 복수를 시작하지 마십시오. 둘째, 누군가가 실제로 솔루션을 사용했는데 반 시간 동안 완전히 실패했다면 "다른 경우"에 실패했다는 사실에 의해 콘솔에 표시되지 않습니다. lsb기본적으로 시스템이 설치 되지 않았습니다 .
Parthian Shot

1

상황이 필요한 경우 snmpwalk (또는 일반적으로 SNMP 프로토콜)를 사용하여 원격으로 찾을 수 있습니다. 예는 다음과 같습니다.

snmpwalk -Os -c <snmp community string> -v1 <hostname> sysDescr.0

OUPUT : sysDescr.0 = 문자열 : Linux example.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP 토요일 9 월 14 일 05:32:37 EDT 2013 x86_64

안정성의 핵심은 사용자 환경에서 SNMP가 올바르게 설정되어 있고 모든 호스트가 적절한 커뮤니티 문자열 설정으로 snmp를 실행하고 있는지 여부입니다.


무엇입니까 snpwalk? 어디서 찾을 수 있습니까? 또한 배포 정보가없는 "Linux"만 인쇄합니다 (원하는 unameLinux). Linux 이외의 OS에서 작동합니까? UNIX에서 BSD 또는 OSX?
terdon

snmpwalk는 Linux 명령 행 유틸리티입니다. 그것은 단지 "Linux"를 인쇄하는 것이 아니라 실제로 필요한 유일한 커널 버전을 인쇄합니다. SNMP가 UNIX, BSD, OSX인지 여부에 관계없이 SNMP가 다른 호스트에 구성되어 있으면 snmpwalk는 표준 (v1 | v2c | v3)으로 작동하며 Windows 호스트의 수역에서도 작동합니다. snmpget 또는 snmpgetnext도 참조하십시오.
xpros

잘 들리지만 답변을 수정 하고 답변을 찾을 수있는 곳을 설명해 주시겠습니까? 예를 들어 데비안 저장소는 아닙니다. 또한 그것이 제공 uname -a하지 않는 것이 무엇인지, 그리고이 질문에 관한 분포의 이름을 어떻게 말해 줄 수 있는지 설명하십시오. 어쨌든,이 정보를 반환 할 수 있다고 가정하더라도 비표준 유틸리티이므로 설치해야한다고 생각하면 여기에서 유용 할 것입니다. 아이디어는 원격 시스템에 로그온하여 OS (Linux 인 경우 배포 포함)를 찾는 것입니다.
terdon

it also prints the kernel version which is really the only thing you need하지만 ... 이것이이 질문의 요점입니다. 그게 정말 필요한 전부라면을 사용할 수 있습니다 uname -a. 커널은 운영 체제의 중요한 부분이지만 전체 운영 체제는 아닙니다. 파일 시스템 레이아웃 및 사용자 랜드 유틸리티 (예 : 패키지 관리자)가 중요합니다.
Parthian Shot

1

사용 /etc/os-release:

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.10 (Cosmic Cuttlefish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.10"
VERSION_ID="18.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=cosmic
UBUNTU_CODENAME=cosmic

그 이유는 이 코멘트 에서 @weberjn 에 의해 http://0pointer.de/blog/projects/os-release.html 링크를 통해 FAQ에 잘 설명되어 있습니다. 나는 여기에 2013 년의 최고 의견에 대한 답변을 사용하는 것에 대한 하나의 주장을 여기에 나열합니다 .lsb_release

이미 lsb_release 툴이 있습니다. 왜 사용하지 않습니까?글쎄, 그것은 매우 이상한 인터페이스입니다 : 쉘 스크립트는 호출해야하며 (따라서 C 코드에서 비동기 적으로 생성되어야 함) 확장 가능하도록 작성되지 않았습니다. 많은 배포판에서 선택적인 패키지이며 환영 메시지를 표시하기 위해 초기 부팅의 일부로 기꺼이 호출 할 수있는 것은 없습니다. (사용자 초 미만의 사용자 공간 부팅 시간에 우리는 환영 메시지를 보여주는 것과 같은 사소한 일을 위해 거대한 쉘 스크립트를 호출하고 싶지 않습니다). lsb_release 도구는 배포 검사의 표준화가 필요한 배포 검사를 추상화하려는 시도로 보입니다. 단순히 잘못 설계된 인터페이스입니다. 우리 의견으로는 LSB 버전 자체를 결정하는 인터페이스로 사용되지만 배포 또는 버전 확인에는 사용되지 않습니다.


고맙지 만, 수락 된 답변은 이미 /etc/os-release더 표준이 될 것이라고 설명하는 말의 인용문 에서이 문제를 이미 해결했습니다 . 그러나 해당 파일이 모든 시스템에 항상 존재하는 것은 아니므로 허용되는 답변이 더 이식 가능한 대안을 제공하는 이유입니다. 또한 C 코드를 언급하는 이유를 모르겠습니다. 질문은 C에서 아무것도 호출하는 것에 관한 것이 아닙니다.
terdon

@ terdon 2018에 /etc/os-release없는 시스템이 무엇인지 궁금합니다 . lsb_release기본적으로 제공되지 않는 시스템에 비해 사용자 기반이 비참한 것 같습니다 . 적어도 Fedora에서 귀하의 대답을 사용할 수 없었습니다. C 의견은 내 것이 아니라 systemd내가 제공 한 0pointer.de 링크 의 인용문입니다 .
anatoly techtonik

네, 그것이 당신의 것이 아니라는 것을 알고 있습니다. 왜 C 코드에 대한 인용이 적합하다고 생각하는지 궁금했습니다. 그리고 내가 아는 한, os-release대부분 또는 독점적으로 Linux입니다. 그것은 FreeDesktop.org에 의해 정의 된 것 같습니다 . 따라서 일부 유닉스 풍미가 그것을 사용할 수도 있지만 대부분 또는 임베디드 시스템이나 비 GUI 시스템 등에서 찾을 수있을 것입니다. 안정성 때문에 여전히 오래된 기계를 사용하십시오.
terdon

인용문이 lsb_release나오고 C를 Go로 바꾸고 같은 주장을 할 수 있습니다. 실행 오버 헤드는 lsb_release정적 파일을 구문 분석하는 것보다 보안 및 성능 측면에서 훨씬 높습니다. 안정성을 제공하는 매우 오래된 기계는 믿지 않습니다. Heartbleed와 친구들, 그래서 그냥 사용, 오래 전에 그들을 멀리 했어야/etc/os-release
아나톨리을 techtonik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.