서버관리_05 파일명으로 설치된 RPM 패키지명을 확인하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: rpm, exit
키워드: RPM패키지, 설치
사용처: 서버에 있는 파일인지, 패키지에 있는지, 직접 작성한 것인지 알기 위해 RPM패키지를 조사하고 싶을 때

실행 예제

$ ./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는 패키지에 포함되지 않습니다.

스크립트

#!/bin/bash

# 파일을 지정하는 명령행 인수를 확인
if [ ! -f "$1" ]; then # if문 ------------- 1
  echo "파일이 없습니다: $1" >&2
  exit 2
fi

# 파일명에서 속한 RPM 패키지명 취득
pkgname=$(rpm -qa "$1") # ---------------- 2

# rpm -qf 명령어 결과로 패키지명 표시
if [ $? -eq 0 ]; then # -------------------3
  echo "$1" -> $pkgname"
else
  echo "$1 은 패키지에 포함되지 않습니다." >&2
  exit 1
fi 

해설

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

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

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

  • rpm 명령어로 파일이 속한 패키지 표시
    $ rpm -qf /usr/bin/ldd
    glibc-common-2.12-1.107.e16_4.5.x86_64
    

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

  • rpm 명령어로 파일이 속한 패키지 표시
    $ rpm -ql glibc-common
    /etc/default
    /etc/default/nss
    /etc/gai.conf
    (생략)
    

rpm 명령어는 기능이 많기 때문에 모든 기능을 설명하는 것은 이 책의 범위를 벗어납니다. 예제에서는 ‘-qf 옵션으로 파일에서 패키지명을 취득할 수 있다’는 사실만 이해하기 바랍니다.

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

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

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

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

주의사항

  • 이 스크립트는 리눅스(CentOS)의 rpm 명령어를 이용하므로 CentOS에서만 동작합니다. Mac이나 FreeBSD는 대상 외입니다.
  • CentOS에서는 표준 rpm 패키지 외에도 EPEL(Extra Packages for Enterprise Linux)이라는 확장 패키지가 존재합니다. 최신 패키지를 적극적으로 채용하는 페도라(Fedora)rpm 패키지를 CentOS에서 이용 가능한 것이 EPEL입니다. CentOS 표준 패키지에서 찾을 수 없는 소프트웨어도 EPEL이라면 찾을 수 있는 경우도 많습니다. EPEL을 사용하려면 페도라 프로젝트 웹페이지에서 epel-release라는 rpm 패키지를 내려받아서 설치합니다. 이걸로 리포지토리에 추가된 EPEL 사이트에서 yum 명령어로 EPEL 패키지를 설치할 수 있게 됩니다. 자세한 내용은 페도라 프로젝트 웹 사이트에서 EPEL 설명을 확인해보기 바랍니다.