[Linux 셸 스크립트] 서버 관리 - 108 파일명으로 설치된 RPM 패키지명을 확인하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 서버 관리 - 108 파일명으로 설치된 RPM 패키지명을 확인하기

by 찬찬이 아빠 2021. 4. 23.
반응형
  1. 사용 명령어

(1) rpm

(2) exit

 

 

  2. 키워드 & 사용처

(1) 키워드

RPM 패키지, 설치

 

(2) 사용처

서버에 있는 파일인지, 패키지에 있는지, 직접 작성한 것인지 알기 위해 RPM 패키지를 조사하고 싶을 때 사용합니다.

 

  3. 실행 예제
$ ./rpm-compkg.sh /etc/ntp.conf
/etc/ntp.conf -> ntp-4.2.4p8-3.el6.centos.x86_64

$ ./rpm-compkg.sh /etc/my.cnf
/etc/my.cnf는 패키지에 포함되지 않습니다.

 

 

  4. 스크립트

#!/bin/sh

 

# 파일을 지정하는 명령행 인수를 확인

if [ ! -f "$1" ]; then           

    echo "파일이 없습니다: $1" >&2       

    exit 2       

fi

 

# 파일명에서 속한 RPM 패키지명 취득

pkgname=$(rpm -qf "$1")       

 

# rpm -qf 명령어 결과로 패키지명 표시

if [ $? - eq 0 ]; then       

    echo "$1 -> $pkgname"

else

    echo "$1은 패키지에 포함되지 않습니다." >&2

    exit 1

fi

 

 

  5. 해설

이 스크립트는 명령행 인수로 파일을 지정해서 그 파일이 패키지 관리 시스템인 RPM 패키지에 속하는지 조사해서 패키지명을 표시합니다. RPM이란 레드햇이 개발한 패키지 관리 시스템 명칭으로 그 설치 관련 조작을 하는 것이 rpm 명령어입니다. RPM은 RedHat Linux나 CentOS에서 이용할 수 있습니다.

 

리눅스 서버 관리와 운용을 오랫동안 하다 보면 서버에 설치한 파일이 누군가 직접 만든건지 아니면 패키지 설치 시 자동으로 설치된 건지 알 수 없는 경우가 있습니다. 예제에서는 운용하면서 이런 걸 조사한다고 가정합니다.

 

어떤 파일이 어떤 패키지에 속해 있는지 조사하려면 rpm 명령어에 -qf 옵션을 이용합니다. 이 명령어는 다음처럼 파일을 지정해서 파일이 속한 rpm 패키지명을 표시합니다.

$ rpm -qf /usr/bin/ldd
glibc-common-2.12-1.107.el6_4.5.x86_64

그리고 반대로 패키지명을 지정해서 그 패키지에 포함된 파일 목록을 출력할 수도 있습니다. 이때 rpm 명령어 -ql 옵션으로 패키지명을 지정합니다. 패키지 버전 번호는 생략할 수 있습니다.

$ rpm -ql glibc-common
/etc/default
/etc/default/nss
/etc/gai.conf
... 생략 ...

 

에서 명령행 인수를 확인합니다. 예제에서는 인수로 파일을 지정하므로 이 파일이 존재하는지 test 명령어로 확이합니다. 여기서 -f는 대상이 일반 파일인지 확인하는 연산자입니다. 그걸 부정 연산자 !와 함께 써서 일반 파일이 아니면 에러를 표시하고 종료합니다.

 

에서 rpm 명령어 -qf 옵션으로 이용해서 패키지명을 취득하빈다. 셸의 위치 파라미터 $1은 명령행 인수 첫 번째를 나타내므로 예제에서는 지정한 파일 경로가 들어가 있습니다. 명령어 치환 $( )을 사용해서 rpm 명령어 출력 결과를 셸 변수 pkgname에 대입합니다.

 

은 패키지명을 표시합니다. rpm 명령어 -qf 옵션은 지정한 파일이 어떤 패키지에도 속하지 않으면 에러가 발생해서 종료 스테이터스 1을 돌려줍니다. 따라서 종료 스테이터스 $?에 따라 if 문으로 분기합니다. rpm 명령어가 성공하면 파일명과 그 패키지명을 표시해서 실패했을 때(종료 스테이터스가 0이 아닐 때)는 어느 패키지에도 속하지 않았다고 표시하고 종료합니다.

 

그리고 이 스크립트는 인수에 지정한 파일이 없을 때 exit 2로 종료 스테이터스 2를 파일이 잇지만 어느 패키지에도 속하지 않았을 때 exit 1로 종료 스테이터스 1을 돌려줍니다. 이러면 이 스크립트를 다른 스크립트에서 이용할 때 종료 스테이터스를 이용해서 결과를 판별할 수 있습니다.

 

 

<주의사항>

이 스크립트는 리눅스(CentOS)의 rpm 명령어를 이용하므로 CentOS에서만 동작합니다.

CentOS에서는 표준 rpm 패키지 외에도 EPEL(Extra Packages for Enterprise Linux)이라는 확장 패키지가 존재합니다. 최신 패키지를 적극적으로 채용하는 페도라(Fedora) rpm 패키지를 CentOS에서 이용 가능한 것이 EPEL입니다. CentOS 표준 패키지에서 찾을 수 없는 소프트웨어도 EPEL 이라면 찾을 수 있는 경우도 많습니다. EPEL을 사용하려면 페도라 프로젝트 웹 페이지에서 epel-releas라는 rpm 패키지를 내려받아서 설치합니다. 이걸로 리포지토리에 추가된 EPEL 사이트에서 yum 명령어로 EPEL 패키지를 설치할 수 있게 됩니다.

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글