Làm thế nào để tôi trích xuất nội dung của một vòng / phút?


154

Tôi có một vòng / phút và tôi muốn coi nó như một quả bóng. Tôi muốn trích xuất nội dung vào một thư mục để tôi có thể kiểm tra nội dung. Tôi quen thuộc với các lệnh truy vấn của gói đã gỡ cài đặt. Tôi không chỉ đơn giản muốn một danh sách các nội dung của vòng / phút. I E

$ rpm -qpl foo.rpm

Tôi muốn kiểm tra nội dung của một số tập tin có trong vòng / phút. Tôi không muốn cài đặt vòng / phút. Tôi cũng nhận thức được khả năng của rpms để thực hiện các sửa đổi bổ sung trong phần% bài đăng và cách kiểm tra chúng. I E

$ rpm -qp --scripts foo.rpm

Tuy nhiên trong trường hợp này điều đó không liên quan đến tôi.

Câu trả lời:


184

Bạn đã thử rpm2cpiocomm comm? Xem ví dụ dưới đây:

$ 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
Tôi rất ngạc nhiên khi các bản phân phối Linux không cung cấp một trình bao bọc thực thi để làm cho việc này dễ dàng hơn (ví dụ: rpmextract bla.rpm), vì đây là một hoạt động rất phổ biến. Người dùng không cần phải quan tâm đến định dạng cpio trung gian.
Alan Evangelista

2
Đừng ngạc nhiên, @AlanEvangelista, đây là mệnh cho khóa học.
ngreen

điều này cần quyền truy cập root để cài đặt rpm2cpio :(
törzsmókus 9/2/2015

9
@AlanEvangelista Tôi ngạc nhiên rằng vòng / phút là định dạng xấu như vậy. So sánh với các tranh luận giống như khác chỉ là tài liệu lưu trữ đơn giản tuân thủ triết lý UNIX.
Trismegistos

1
@SumitMurari Tất nhiên là tệ. Tôi chỉ đưa ra một giải pháp cho tình trạng khó khăn của törzsmókus.
MirroredFate

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

Để tham khảo: các đối số cpio là

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

Tôi tìm thấy câu trả lời ở đây: câu trả lời của lontar


1
"rpm2cpio foo.rpm | cpio -idmv" hoạt động với tôi. Nó là đủ để trích xuất nội dung của vòng / phút tại đường dẫn hiện tại.
ký sinh

32

Đối với những người không có rpm2cpio, đây là tập lệnh rpm2cpio.sh cổ đại trích xuất tải trọng từ gói * .rpm.

Đăng lại cho hậu thế đào và thế hệ tiếp theo.

Gọi như thế này: ./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

Tôi nhận được lỗi này "unlzma: tiêu đề lzma xấu" khi sử dụng Alpine Linux. Đã thử nhiều rpms.
jekennedy

27

Đôi khi bạn có thể gặp sự cố với lưu trữ RPM trung gian:

cpio: Số không đúng định dạng
cpio: Số không đúng số
cpio: Số không đúng
. . .
cpio: kết thúc sớm của kho lưu trữ

Điều đó có nghĩa là nó có thể được đóng gói, ngày nay nó được nén LZMA2 như bình thường, bởi xz:

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

nếu không bạn có thể thử:

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

2
tôi vừa gặp điều này Cảm ơn!
Sam Stoelinga

2
Rất hữu ích. Cảm ơn ngài!
ILIV

1
phao cứu sinh. @LasseHalbergHaarbye tôi đã thêm nó vào câu trả lời được chấp nhận.
Joseph Farah

Tôi đã nhận được các lỗi "Số không đúng định dạng" và "kết thúc sớm của kho lưu trữ" nhưng cả hai giải pháp được đăng đều không phù hợp với tôi. Tôi đã phải làm rpm2cpio <file>.rpm | bsdtar -xf -(không có cpio) để nó hoạt động.
jackkamm

Các kho lưu trữ trung gian cuối cùng đã được định dạng gzip cho tôi, vì vậy tôi đã sử dụng gunzipthay vì xzhoặc lzmahoạt động tốt.
jayhendren

9

Hầu hết các bản phân phối đã cài đặt con lăn tệp ứng dụng GUI để giải nén tar, zip, vòng / phút và nhiều hơn nữa.

file-roller --extract-here package.rpm

Điều này sẽ trích xuất nội dung trong thư mục hiện tại.


6

7-zip hiểu hầu hết các loại tài liệu lưu trữ, bao gồm cả vòng / phút và cpio đi kèm.


Tôi đã thử với 7 zip và nó đã hoạt động hoàn hảo.
anshul

5

Bạn chỉ có thể làm tar -xvf <rpm file>là tốt!


Không thể sao chép điều đó với gói .rpm. Bạn có thể muốn sửa câu trả lời của bạn.
gvlasov

9
Điều này hoạt động trên OS X - hoặc bất kỳ hệ thống nào khác sử dụng một biến thể tarsử dụng libarchivedưới mui xe.
Glenjamin

2
Tôi đã nhận được lỗi: Đây không giống như một kho lưu trữ tar.
wp-overwatch.com

Điều này làm việc với tôi trên MacOS 10.14.1 với bsdtar 2.8.3 - libarchive 2.8.3. Nó có thể phụ thuộc vào loại nén được sử dụng. Kịch bản rpm2cpio.sh dường như kiểm tra một số loại nén trước khi chuyển nó sang đúng công cụ để trích xuất.
2xj

Vì chức năng chỉnh sửa của SO sẽ không cho phép tôi thêm 3 ký tự để sửa câu trả lời, nên cần thêm rằng điều này đòi hỏi phải có chế độ tự trị bsdtar. Homebrew trên Mac liên kết tarvới nó theo mặc định nhưng trên các HĐH khác tarcó nghĩa là GNU tar.
Atemu

5

Trình quản lý tệp dựa trên văn bản mạnh mẽ mc (Midnight Commander, mơ hồ nhắc nhở Norton Commander của thời DOS cũ) có khả năng tích hợp để kiểm tra và giải nén các tệp .rpm và .rpms, chỉ cần "mở" tệp .rpm (s) trong mc và chọn CONTENTS.cpio: trong một vòng / phút, bạn có quyền truy cập vào cây cài đặt, với một rpms bạn có quyền truy cập vào tệp .spec và tất cả các gói nguồn.




1

Trong OpenSuse ít nhất, unrpmlệnh đi kèm với buildgói.

Trong một thư mục phù hợp (vì đây là bom lưu trữ):

unrpm file.rpm

1

Sao chép tệp .rpm trong một thư mục riêng sau đó chạy lệnh sau $ yourfile.rpm | cpio -idmv


đây nên là bình luận
ketan

1

Thử nghiệm "DECOMPRESSION" không thành công trên CygWin, một trong những nền tảng hữu ích nhất cho nó, do kiểm tra "grep" cho "xz" có phân biệt chữ hoa chữ thường hay không. Kết quả của kiểm tra "TÍNH NĂNG:" là:

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

Chỉ cần thay thế 'grep -q' bằng 'grep -q -i' ở mọi nơi dường như sẽ giải quyết tốt vấn đề.

Tôi đã thực hiện một vài cập nhật, đặc biệt là thêm một số nhận xét và sử dụng "trường hợp" thay vì các câu lệnh "nếu" xếp chồng lên nhau và bao gồm sửa lỗi bên dưới

#!/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 có thể trích xuất nội dung. Nó hoạt động giống như cách một tệp tar.gz hoạt động. Một tập tin nén bên trong một tập tin nén.

Trên Windows 7 Pro đã cài đặt 7-Zip:

Nhấp chuột phải vào tập tin vòng / phút. Chuột trên 7-Zip trong menu ngữ cảnh. Chọn giải nén thành "tên tệp".

Nhập vào thư mục tên tệp.

Nhấp chuột phải vào tập tin cpio. Chuột trên 7-Zip trong menu ngữ cảnh. Chọn giải nén thành "tên tệp".

Bạn xong việc rồi. Thư mục có "tên tệp" chứa nội dung được trích xuất để kiểm tra.

Tôi biết các bạn Linux coi thường mọi thứ trở nên dễ dàng, nhưng về lâu dài, nếu bạn phải dành thời gian tìm kiếm một giải pháp cho một vấn đề đơn giản như thế này; sự không hiệu quả đó làm bạn mất tiền

Với thực tế là các bạn Linux coi thường sự đơn giản hiệu quả, tôi rất nghi ngờ rằng phiên bản Linux 7-Zip sẽ làm điều tương tự theo cùng một cách chính xác.

Tại sao làm cho nó dễ dàng khi bạn có thể làm cho hết sức ngu ngốc và tự nhận mình là một thiên tài cùng một lúc?

Chỉ để được rõ ràng; Tôi không phải là một fanboy của Windows. Tôi thực sự đang tìm cách chuyển sang Linux. Tôi chỉ không thể cưỡng lại cơ hội cọ xát những gì các nhà phát triển Windows sẽ thấy là lẽ thường, những thực tiễn tốt nhất dành cho nhà phát triển vào khuôn mặt của bạn.

Hãy vui mừng vì tôi đã đăng bài này và bạn không có Mark Harmon đứng bên cạnh bạn; Đặc vụ Leroy Jethro Gibbs đã thực hiện cho bạn một cái tát đầu vì không sử dụng đầu của bạn.

Tôi không biết Gibbs cai trị nó là gì nhưng quy tắc là: Đừng làm mọi thứ trở nên khó khăn hơn so với thực tế.

Bây giờ chúng ta có thể xem ai cần đi nghỉ. Bảo trọng!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.