때로는 스크립트가 다른 Linux에서 다르게 작동해야합니다. 스크립트가 실행중인 Linux 버전을 어떻게 확인할 수 있습니까?
때로는 스크립트가 다른 Linux에서 다르게 작동해야합니다. 스크립트가 실행중인 Linux 버전을 어떻게 확인할 수 있습니까?
답변:
할 수있는 것과 할 수없는 것에 대한 배포판을 근거로 가정하지 마십시오. 그 방법은 광기입니다 ( "사용자 에이전트 탐지"참조). 대신, 수행하려는 작업이 지원되는지 여부와 사용하려는 명령 또는 파일 위치에 따라 수행 방법을 감지하십시오.
예를 들어, 패키지를 설치하려면 dpkg 또는 rpm이 있는지 확인하여 데비안 시스템 또는 RedHat 시스템과 같은 시스템인지 여부를 감지 할 수 있습니다 (데비안 머신은 그들에 대한 rpm 명령 ...). 데비안 시스템인지 레드햇 시스템인지가 아니라 그에 기반하여 무엇을할지 결정하십시오. 그렇게하면 명시 적으로 프로그래밍하지 않은 파생 배포판을 자동으로 지원할 수 있습니다. 아. 패키지에 특정 종속성이 필요한 경우 해당 종속성도 테스트하여 누락 된 내용을 사용자에게 알려주십시오.
또 다른 예는 네트워크 인터페이스를 다루는 것입니다. / etc / network / interfaces 파일이 있는지 또는 / etc / sysconfig / network-scripts 디렉토리가 있는지에 따라 수행 할 작업을 수행 한 다음 그 위치로 이동하십시오.
그렇습니다. 더 효과적이지만 지난 10 년 이상 웹 개발자가 저지른 모든 실수를 다시 만들고 싶지 않다면 처음부터 현명한 방법으로 할 수 있습니다.
교차 배포 방법이 없습니다. 하나:
- 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에서만 올바르게 작동합니다. 다른 쉘을 위해 다시 작성할 수 있습니다.
즉, 배포가 아닌 기능을 테스트하려고 할 수 있습니다. 유지 보수 부담이되어 더 이상 이것을 사용하지 않습니다. 교차 배포 도구 및 솔루션을 사용하는 것이 더 쉽습니다.
개념적으로 다음과 같은 순서로 수행됩니다.
- 알려진 "공통 초기화 스크립트 함수"유형의 파일을 가져옵니다. 배포판에 따라 다릅니다. 존재하지 않으면 다음 배포 확인으로 건너 뜁니다.
- 알려진, 존재, 자주 사용되며 이름이 변경되지 않는 특정 핵심 스크립트가 존재하는지 확인하십시오. 우리는
type
Bash 내장 을 사용하여 그렇게합니다 . 해당 기호가 함수이면를type -t
반환function
합니다. 이름이 정의되지 않으면 출력 문자열이 비어 있고 연산자의 왼손 누락에 대한 구문 오류가 발생하기 때문에zz
출력을 앞에 추가 합니다 . 방금 확인한 이름이 함수가 아닌 경우 다음 배포 확인으로 건너 뛰십시오. 그렇지 않으면 배포 유형을 찾았습니다.type -t 2>/dev/null
==
- 마지막으로, 배포 유형을 에코하여 함수 출력을 .. esac 블록에서 쉽게 사용할 수 있도록합니다.
이 스크립트를 직선 스크립트로 실행하려는 경우 편집하십시오.이 스크립트는 다른 스크립트에서 소스로 제공되거나 포함되어야합니다. 그대로 실행하면 자체적으로 아무것도 출력하지 않습니다. 테스트하려면 소스를 작성한 다음 함수를 호출하십시오. 예 :
source /path/to/this/script.sh
get_distribution_type
bash 프롬프트에서.
편집 :이 스크립트에는 루트 권한이 필요하지 않습니다. 루트로 실행하지 말 것을 권한다. 아무것도 해치지 않아야하지만 필요는 없습니다.
CVS 로그에서 관련 메일 링리스트 게시물 에 대한 링크를 찾았습니다 . 초기화 스크립트 스파게티를 풀 때 유용합니다.
당신은 실행하여 커널 버전을 찾을 수 있습니다 uname -a
배포판 버전을 찾는 것은, 배포판에 따라 달라집니다.
우분투와 다른 OS에서는 lsb_release -a
/ etc / lsb_release를 실행 하거나 읽을 수 있습니다
데비안은 / etc / debian_version에 버전을 저장합니다
대부분의 배포판에는 특정 분포를 결정하는 고유 한 방법이 있습니다.
예를 들면 다음과 같습니다.
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
Linux Standard Base 또는 LSB 로 알려진 표준이 있습니다 . / etc / lsb-release라는 파일이나 lsb_release라는 프로그램이 있어야 리눅스 배포판에 대한 정보를 되돌릴 수 있습니다.
lsb_release -a
lsb_release
CentOS 6에는 존재하지 않습니다.
python -c 'import platform ; print platform.dist()[0]'
python -c 'import platform; print(platform.dist()[0])'
일반 python의 기본값이 python3 인 경우에도 작동하므로을 사용하는 것이 좋습니다 .
uname -a
좋아하는 껍질에 입력 하기 만하면됩니다. 커널 이름과 버전이 출력됩니다.
마크, 아담, 미하이와 동의합니다 (불충분 한 평판으로 인해 투표 할 수 없습니다). LSB 및 관련 FHS 기반 솔루션 은 대부분의 배포에서 작동하며 앞으로도 계속 작동 할 것입니다. LSB와 FHS는 당신의 친구입니다.
리눅스 버전은 어려운 질문이다. 우리가 좁게 살펴보면 " 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...
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 와 같은 네트워크의 시스템을 관리하기 위해 더 넓은 솔루션과 결합 할 수 있습니다 .