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

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

$ rpm -qpl foo.rpm

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

$ rpm -qp --scripts foo.rpm

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



답변

당신은 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


답변

$ 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


답변

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


답변

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

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

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

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

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

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


답변

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

file-roller --extract-here package.rpm

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


답변

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


답변

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