rpm의 내용을 어떻게 추출합니까?


154

나는 rpm을 가지고 있고 그것을 tarball처럼 취급하고 싶다. 내용을 디렉토리로 추출하여 내용을 검사하고 싶습니다. 제거 된 패키지의 쿼리 명령에 익숙합니다. 나는 단순히 rpm의 내용 목록을 원하지 않습니다. 즉

$ rpm -qpl foo.rpm

rpm에 포함 된 여러 파일의 내용을 검사하고 싶습니다. rpm을 설치하고 싶지 않습니다. 또한 % post 섹션에서 추가 수정을 수행 할 수있는 rpms 기능과이를 확인하는 방법도 알고 있습니다. 즉

$ rpm -qp --scripts foo.rpm

그러나이 경우에는 걱정하지 않아도됩니다.

답변:


184

당신은 rpm2cpio명령 을 시도 했습니까 ? 아래 예를 참조하십시오.

$ rpm2cpio php-5.1.4-1.esp1.x86_64.rpm | cpio -idmv

/etc/httpd/conf.d/php.conf  
./etc/php.d  
./etc/php.ini  
./usr/bin/php  
./usr/bin/php-cgi  
etc 

28
나는 리눅스 배포판이 래퍼 실행 파일을 제공하지 않기 때문에 놀랍다 (예를 들어 rpmextract bla.rpm). 사용자는 중개 cpio 형식에 신경 쓸 필요가 없습니다.
Alan Evangelista

2
@AlanEvangelista, 놀라지 마십시오. 이것은 코스에 필적합니다.
ngreen

rpm2cpio 설치를 위해서는 루트 액세스 권한이 필요합니다 :(
törzsmókus

9
@AlanEvangelista rpm이 나쁜 형식이라는 사실에 놀랐습니다. 유닉스 철학을 고수하는 단순한 아카이브 인 다른 유사한 토론과 비교합니다.
Trismegistos

1
@SumitMurari 물론 나쁘다. 나는 단지 törzsmókus의 곤경에 대한 해결책을 제공하고있었습니다.
MirroredFate

66
$ mkdir packagecontents; cd packagecontents
$ rpm2cpio ../foo.rpm | cpio -idmv
$ find . 

참조 : cpio 인수는

-i = extract
-d = make directories
-m = preserve modification time
-v = verbose

나는 여기에서 답을 찾았습니다 : lontar 's answer


1
"rpm2cpio foo.rpm | cpio -idmv"는 저에게 효과적입니다. 전류 경로에서 rpm의 내용을 추출하는 것으로 충분합니다.
parasrish

32

rpm2cpio가없는 사람들을 위해 * .rpm 패키지에서 페이로드를 추출하는 고대 rpm2cpio.sh 스크립트가 있습니다.

후손과 다음 세대를 위해 다시 게시되었습니다.

다음과 같이 호출하십시오. ./rpm2cpio.sh .rpm | cpio -dimv

#!/bin/sh

pkg=$1
if [ "$pkg" = "" -o ! -e "$pkg" ]; then
    echo "no package supplied" 1>&2
    exit 1
fi

leadsize=96
o=`expr $leadsize + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# echo "sig il: $il dl: $dl"

sigsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# echo "hdr il: $il dl: $dl"

hdrsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $hdrsize`
EXTRACTOR="dd if=$pkg ibs=$o skip=1"

COMPRESSION=`($EXTRACTOR |file -) 2>/dev/null`
if echo $COMPRESSION |grep -q gzip; then
        DECOMPRESSOR=gunzip
elif echo $COMPRESSION |grep -q bzip2; then
        DECOMPRESSOR=bunzip2
elif echo $COMPRESSION |grep -iq xz; then # xz and XZ safe
        DECOMPRESSOR=unxz
elif echo $COMPRESSION |grep -q cpio; then
        DECOMPRESSOR=cat
else
        # Most versions of file don't support LZMA, therefore we assume
        # anything not detected is LZMA
        DECOMPRESSOR=`which unlzma 2>/dev/null`
        case "$DECOMPRESSOR" in
            /* ) ;;
            *  ) DECOMPRESSOR=`which lzmash 2>/dev/null`
             case "$DECOMPRESSOR" in
                     /* ) DECOMPRESSOR="lzmash -d -c" ;;
                     *  ) DECOMPRESSOR=cat ;;
                 esac
                 ;;
        esac
fi

$EXTRACTOR 2>/dev/null | $DECOMPRESSOR

Alpine Linux를 사용하여 "unlzma : bad lzma header"라는 오류가 발생합니다. 여러 rpm을 시도했습니다.
jekennedy

27

때때로 중간 RPM 아카이브에 문제가 발생할 수 있습니다.

cpio : 기형 번호
cpio : 기형 번호
cpio : 기형 번호
. . .
cpio : 아카이브의 조기 종료

즉, 평소와 같이 LZMA2 압축 방식으로 압축 할 수 있습니다 xz.

rpm2cpio <file>.rpm | xz -d | cpio -idmv

그렇지 않으면 시도해 볼 수 있습니다.

rpm2cpio <file>.rpm | lzma -d | cpio -idmv

2
방금이 문제가 발생했습니다. 감사!
Sam Stoelinga

2
굉장히 유용하다. 감사합니다!
ILIV

1
생명의 은인. @LasseHalbergHaarbye 나는 그것을 허용 된 답변에 추가했습니다.
Joseph Farah

"잘못된 숫자"및 "아카이브의 조기 종료"오류가 발생했지만 게시 된 솔루션 중 어느 것도 효과가 없었습니다. 나는 rpm2cpio <file>.rpm | bsdtar -xf -그것이 작동 하기 위해 (cpio 없음)해야했습니다.
jackkamm

중간 아카이브는 나를 위해 gzip 형식으로 만들어 졌으므로 gunzip대신에 xz또는 lzma잘 작동했습니다.
jayhendren

9

대부분의 배포판은 tar, zip, rpm 등을 압축 해제 하는 GUI 앱 파일 롤러 를 설치했습니다 .

file-roller --extract-here package.rpm

현재 디렉토리의 내용을 추출합니다.


6

7-zip 은 rpm 및 포함 된 cpio를 포함한 대부분의 아카이브를 이해합니다.


나는 7 zip으로 시도했으며 완벽하게 작동했습니다.
anshul

5

당신도 간단하게 할 수 있습니다 tar -xvf <rpm file>!


.rpm 패키지로이를 재현 할 수 없습니다. 답을 수정하고 싶을 수도 있습니다.
gvlasov

9
OS X에이 작품 - 또는 변형 사용하는 다른 시스템 tar하는 용도 libarchive후드.
Glenjamin

2
오류가 발생했습니다 : 이것은 tar 아카이브처럼 보이지 않습니다.
wp-overwatch.com

이것은 bsdtar 2.8.3-libarchive 2.8.3의 MacOS 10.14.1에서 나를 위해 일했습니다. 사용 된 압축 유형에 따라 달라질 수 있습니다. rpm2cpio.sh 스크립트는 추출을 위해 올바른 도구로 전달하기 전에 여러 유형의 압축을 확인하는 것 같습니다.
2xj December

SO의 편집 기능으로 답을 수정하기 위해 3자를 추가 할 수 없으므로 libarchive 's가 필요하다는 것을 추가해야합니다 bsdtar. Mac의 Homebrew는 tar기본적으로 그것에 연결 되어 있지만 다른 OS에서는 tarGNU tar를 의미합니다.
Atemu

5

강력한 텍스트 기반 파일 관리자 mc (Midnight Commander, 노턴 사령관에게 오래된 DOS 시간을 모호하게 알리는 기능)에는 .rpm 및 .rpms 파일을 검사하고 압축을 풀 수있는 기능이 내장되어 있습니다. mc 내에서 CONTENTS.cpio다음을 선택하십시오 . rpm의 경우 설치 트리에 액세스하고 rpm의 경우 .spec 파일 및 모든 소스 패키지에 액세스하십시오.




1

OpenSuse에서는 최소한 패키지 unrpm와 함께 명령이 제공 build됩니다.

적절한 디렉토리에서 (이것은 아카이브 폭탄이기 때문에) :

unrpm file.rpm

1

.rpm 파일을 별도의 폴더에 복사 한 후 다음 명령을 실행하십시오. $ yourfile.rpm | cpio -idmv


이것은 코멘트이어야한다
ketan

1

"decompression"테스트는 대소 문자를 구분하는 "xz"에 대한 "grep"검사로 인해 가장 강력하게 유용한 플랫폼 중 하나 인 CygWin에서 실패합니다. "압축 :"점검 결과는 다음과 같습니다.

COMPRESSION='/dev/stdin: XZ compressed data'

어디에서나 'grep -q'를 'grep -q -i'로 바꾸면 문제가 해결되는 것 같습니다.

몇 가지 업데이트를 수행했습니다. 특히 주석을 추가하고 누적 된 "if"문 대신 "case"를 사용하고 아래 수정 사항이 포함되었습니다.

#!/bin/sh
#
# rpm2cpio.sh - extract 'cpio' contents of RPM
#
# Typical usage: rpm2cpio.sh rpmname | cpio -idmv
#

if [ "$# -ne 1" ]; then
    echo "Usage: $0 file.rpm" 1>&2
    exit 1
fi

rpm="$1"
if [ -e "$rpm" ]; then
    echo "Error: missing $rpm"
fi


leadsize=96
o=`expr $leadsize + 8`
set `od -j $o -N 8 -t u1 $rpm`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# echo "sig il: $il dl: $dl"

sigsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
set `od -j $o -N 8 -t u1 $rpm`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
# echo "hdr il: $il dl: $dl"

hdrsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $hdrsize`
EXTRACTOR="dd if=$rpm ibs=$o skip=1"

COMPRESSION=`($EXTRACTOR |file -) 2>/dev/null`
DECOMPRESSOR="cat"

case $COMPRESSION in
    *gzip*|*GZIP*)
        DECOMPRESSOR=gunzip
        ;;
    *bzip2*|*BZIP2*)
        DECOMPRESSOR=bunzip2
        ;;
    *xz*|*XZ*)
        DECOMPRESSOR=unxz
        ;;
    *cpio*|*cpio*)
        ;;
    *)
        # Most versions of file don't support LZMA, therefore we assume
        # anything not detected is LZMA
        DECOMPRESSOR="`which unlzma 2>/dev/null`"
        case "$DECOMPRESSOR" in
            /*)
                DECOMPRESSOR="$DECOMPRESSOR"
                ;;
            *)
                DECOMPRESSOR=`which lzmash 2>/dev/null`
                case "$DECOMPRESSOR" in
                    /* )
                        DECOMPRESSOR="lzmash -d -c"
                        ;;
                    *  )
                        echo "Warning: DECOMPRESSOR not found, assuming 'cat'" 1>&2
                        ;;
                esac
                ;;
        esac
esac

$EXTRACTOR 2>/dev/null | $DECOMPRESSOR

1

7-Zip은 내용을 추출 할 수 있습니다. tar.gz 파일과 동일한 방식으로 작동합니다. 압축 파일 내부의 압축 파일

7-Zip이 설치된 Windows 7 Pro :

rpm 파일을 마우스 오른쪽 버튼으로 클릭하십시오. 상황에 맞는 메뉴에서 7-Zip 위로 마우스를 가져갑니다. "파일 이름"으로 추출을 선택하십시오.

파일 이름 폴더에 입력하십시오.

cpio 파일을 마우스 오른쪽 버튼으로 클릭하십시오. 상황에 맞는 메뉴에서 7-Zip 위로 마우스를 가져갑니다. "파일 이름"으로 추출을 선택하십시오.

끝났습니다. "filename"이있는 폴더에는 검사를 위해 추출 된 내용이 들어 있습니다.

나는 리눅스 사람들이 쉽게 만드는 일을 멸시하지만 장기적으로는 이와 같은 간단한 문제에 대한 해결책을 찾기 위해 시간을 보내야한다는 것을 알고 있습니다. 비 효율성으로 인해 비용이 발생합니다.

Linux 사용자가 효율적인 단순성을 경멸한다는 사실을 감안할 때 7-Zip의 Linux 버전이 똑같은 방식으로 동일한 작업을 수행 할 것입니다.

멍청한 짓을하면서 동시에 천재라고 주장 할 때 왜 쉽게 할 수 있습니까?

분명히하기 위해; 저는 Windows fanboy가 아닙니다. 나는 실제로 리눅스로 이동하는 것을 찾고 있습니다. 저는 Windows 개발자가 상식적이고 모범적 인 개발자 관행으로 생각하는 것을 당신의 얼굴에 문지르는 기회를 막을 수 없었습니다.

이 글을 게시하게되어 기쁘고, 마크 하몬이 당신 옆에 서 있지 않아도됩니다. 특수 요원 Leroy Jethro Gibbs는 머리를 쓰지 않아 머리를 때리게했을 것입니다.

나는 그것이 어떤 깁스 규칙인지는 모르지만 그 규칙은 다음과 같습니다. 자신보다 더 힘들게 만들지 마십시오.

이제 누가 휴가를 가야하는지 알게되었습니다. 조심해!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.