원격 시스템에 로그인했다고 가정할 때, 그것이 실행되고 있는지 어떻게 알 수 있나요? 대부분의 최신 Linux(Linux?)에는 다음 명령이 있습니다 lsb_release
.
$ lsb_release -ic
Distributor ID: LinuxMint
Codename: debian
내가 아는 한 그것은 와 동일한 정보를 제공합니다 /etc/lsb-release
. 파일이 존재하지 않으면 어떻게 되나요? 명령이 비교적 새로운 것으로 기억하는 것 같은데 lsb_release
, 이전 시스템용 OS를 구해야 한다면 어떻게 해야 할까요?
어쨌든, Linux가 아닌 Unices에서는 작동하지 않을 것이라고 가정합니다 lsb
. Linux Standard Base
내가 아는 한 이 정보를 얻을 수 있는 방법은 없습니다. uname
그렇다면 사용하지 않는 시스템에서 이 정보를 어떻게 얻을 수 있습니까 lsb_release
?
답변1
lsb_release -a
아마도 이 정보를 찾고 일관된 방식으로 찾을 수 있는 것이 가장 좋은 방법일 것입니다.
LSB의 역사
이 명령어의 lsb
대표 항목리눅스 표준 라이브러리이것은리눅스 재단다양한 Linux 배포판에서 기본 작업을 수행하기 위한 일반적인 방법을 제공합니다.
이 프로젝트는 자발적이며 공급업체는 다양한 Linux 배포판 내에서 표준화를 추진하는 데 도움이 되는 다양한 모듈에 대한 다양한 사양의 사용자 또는 촉진자로서 프로젝트에 참여할 수 있습니다.
에서 발췌전세
LSB 워킹 그룹의 핵심 목표는 이 두 가지 문제를 해결하는 것입니다. 주요 배포판 공급업체와의 협의를 통해 우리는 배포판이 지원해야 하는 최소 API 세트를 설명하는 표준을 발표했습니다. 또한 표준에 대한 지원을 측정하고 애플리케이션 개발자가 공통 세트를 대상으로 삼을 수 있도록 테스트 및 도구를 제공합니다. 마지막으로 테스트 노력을 통해 분포 간의 불필요한 차이를 방지하려고 노력합니다.
LSB 관련 유용한 링크
흠잡다
LSB에는 Debian과 같은 배포판에 문제를 일으키는 많은 문제가 있습니다. RPM 사용을 강제하는 것이 그 중 하나입니다. 보다이 문제에 대한 자세한 내용은 Wikipedia 문서를 참조하세요..
노웰
검색하면 다음과 같은 제목의 다소 오래되어 보이는 페이지를 찾을 수 있습니다.기본 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에서 관리되는 다음과 같은 제목의 페이지가 나타납니다. 다양한 Linux(및 기타 Unix) 배포판에 해당하는 /etc/release. 이것은 아마도 내가 지금까지 본 것 중 가장 철저한 목록일 것입니다. case/switch 문을 사용하여 이 목록을 작성하고 소프트웨어 배포에 포함할 수 있습니다.
실제로 페이지 하단에 해당 작업을 수행하는 스크립트가 있습니다. 따라서 소프트웨어 배포에 대한 제3자로서 스크립트를 다운로드하여 사용할 수 있습니다.
스크립트
#!/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 --version
gcc가 실행 중인 시스템과 항상 동일한 배포판을 얻게 됩니다.
페도라14
$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.
센트OS 5.x
$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.
센트OS 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;박사;
그럼 어느 것을 사용해야 할까요? 나는 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
답변2
facter
원격 서버에 설치할 수 없을 수도 있으므로 운영 체제 이름을 찾기 위해 수행하는 작업을 모방할 수 있습니다. operatingsystem
이 사실을 알아낼 수 있는 루비 코드페이스트빈에. 기본적으로 *-release
운영 체제 이름을 결정하기 위해 다양한 파일과 기타 파일을 살펴봅니다 .
살펴보는 파일 중 일부는 다음과 같습니다.
/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
이 목록에서 중복된 항목을 찾으셨다면 죄송합니다. 저는 Quick 을 사용하여 생성했습니다 grep
. 이것을 POSIX 쉘 스크립트로 포팅하는 것은 상당히 쉽습니다(약간 지루하긴 하지만).
답변3
이미 python
설치한 경우(Python 3 또는 Python 2) 배포 이름을 찾을 수 있습니다.바퀴를 재발명할 필요가 없습니다.:
python -c "import platform;print(platform.linux_distribution()[0])"
답변4
모든 배포에 대해 단일 명령으로 배포 이름을 안정적으로 얻을 수는 없습니다. 일부는 /etc/*-release를 통해 사용할 수 있고 다른 일부는 "lsb-release" 명령을 통해 사용할 수 있습니다.