मैं एक आरपीएम की सामग्री कैसे निकालूं?


154

मेरे पास एक आरपीएम है और मैं इसे टारबॉल की तरह व्यवहार करना चाहता हूं। मैं सामग्री को एक निर्देशिका में निकालना चाहता हूं ताकि मैं सामग्री का निरीक्षण कर सकूं। मैं अनइंस्टॉल किए गए पैकेज की क्वेरी कमांड से परिचित हूं। मुझे केवल आरपीएम की सामग्री की सूची नहीं चाहिए। अर्थात

$ rpm -qpl foo.rpm

मैं आरपीएम में निहित कई फाइलों की सामग्री का निरीक्षण करना चाहता हूं। मैं आरपीएम स्थापित नहीं करना चाहता। मुझे% पोस्ट अनुभागों में अतिरिक्त संशोधन करने की आरपीएमएस क्षमता के बारे में भी पता है, और उन लोगों के लिए कैसे जांचें। अर्थात

$ 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 प्रारूप के बारे में परवाह करने की आवश्यकता नहीं होनी चाहिए।
एलन इवेंजलिस्ता

2
हैरान मत हो, @AlanEvangelista, यह पाठ्यक्रम के लिए बराबर है।
19-21

यह rpm2cpio :(
törzsmókus

9
@AlanEvangelista मुझे आश्चर्य है कि आरपीएम इतना खराब प्रारूप है। डिबेट जैसे अन्य की तुलना में जो यूनिक्स दर्शन का पालन करने वाले सरल अभिलेखागार हैं।
त्रिस्मेगिस्टोस

1
@SumitMurari बेशक यह खराब है। मैं बस एक उपाय प्रस्तुत कर रहा था törzsmókus की भविष्यवाणी।
दर्पण

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

संदर्भ के लिए: cpio तर्क हैं

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

मुझे यहाँ पर उत्तर मिला: लोनार का उत्तर


1
"rpm2cpio foo.rpm | cpio -idmv" मेरे लिए काम करता है। यह वर्तमान पथ पर आरपीएम की सामग्री को निकालने के लिए पर्याप्त है।
परिक्रमा

32

उन लोगों के लिए जिनके पास rpm2cpio नहीं है, यहां प्राचीन rpm2cpio.sh स्क्रिप्ट है जो * .rpm पैकेज से पेलोड निकालता है।

पश्चाताप के लिए… और अगली पीढ़ी के लिए फिर से तैयार।

इस तरह आमंत्रित करें :/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

मुझे अल्पाइन लिनक्स का उपयोग करके यह त्रुटि "अनलजमा: खराब लजमा हेडर" मिली। कई आरपीएम की कोशिश की।
जेकनेडी

27

कभी-कभी आप मध्यवर्ती RPM संग्रह के साथ समस्या का सामना कर सकते हैं:

cpio: विकृत संख्या
cpio: विकृत संख्या
cpio: विकृत संख्या
। । ।
cpio: पुरालेख का समयपूर्व अंत

इसका मतलब है कि यह पैक किया जा सकता है, इन दिनों यह हमेशा की तरह LZMA2 संपीड़न है, द्वारा xz:

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

अन्यथा आप कोशिश कर सकते हैं:

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

2
मैंने अभी इसका सामना किया। धन्यवाद!
सैम स्टोइलिंगा

2
बहुत उपयोगी। धन्यवाद महोदय!
ILIV

1
जीवन रक्षक की। @LasseHalbergHARbye मैंने इसे स्वीकृत उत्तर में जोड़ा।
जोसेफ फराह

मुझे "विकृत संख्या" और "संग्रह का समयपूर्व अंत" त्रुटियां मिल रही थीं लेकिन पोस्ट किए गए समाधानों में से किसी ने भी मेरे लिए काम नहीं किया। मुझे काम करने के लिए rpm2cpio <file>.rpm | bsdtar -xf -(कोई cpio) नहीं करना था ।
जैककैम

मध्यवर्ती संग्रह मेरे लिए गज़िप-स्वरूपित हो रहा था, इसलिए मैंने gunzipइसके बजाय प्रयोग किया xzया lzmaजो ठीक काम किया।
ज्येहेंद्रन

9

अधिकांश वितरणों ने GUI ऐप फ़ाइल-रोलर स्थापित किया है जो टार, ज़िप, आरपीएम और कई को अनपैक करता है।

file-roller --extract-here package.rpm

यह वर्तमान निर्देशिका में सामग्री को निकालेगा।


6

7-ज़िप आरपीएम और शामिल सीपीआई सहित अधिकांश प्रकार के अभिलेखागार को समझता है।


मैंने 7 ज़िप के साथ कोशिश की है और इसने पूरी तरह से काम किया है।
अंशुल

5

आप बस के tar -xvf <rpm file>रूप में अच्छी तरह से कर सकते हैं !


एक .rpm पैकेज के साथ पुन: पेश करने में असमर्थ। आप अपना उत्तर सही करना चाहते हैं।
ग्वलासोव

9
यह ओएस एक्स - या किसी अन्य प्रणाली पर काम करता है tarजो एक संस्करण का उपयोग करता है जो libarchiveहुड के नीचे उपयोग करता है ।
ग्लेनजामिन

2
मुझे त्रुटि मिली: यह टार आर्काइव की तरह नहीं दिखता है।
wp-overwatch.com

इसने मेरे लिए मैकओएस 10.14.1 पर bsdtar 2.8.3 के साथ काम किया - libarchive 2.8.3। यह निर्भर करता है कि किस प्रकार के संपीड़न का उपयोग किया गया था। Rpm2cpio.sh स्क्रिप्ट निष्कर्षण के लिए सही उपकरण पर जाने से पहले कई प्रकार के संपीड़न की जांच करने के लिए लगता है।
2xj

के बाद से तो चलो संपादित कार्यक्षमता मुझे जवाब ठीक करने के लिए 3 अक्षरों को जोड़ने नहीं दूँगा, यह जोड़ा जाना चाहिए कि इस libarchive की आवश्यकता है bsdtar। मैक पर Homebrew tarडिफ़ॉल्ट रूप से इसे लिंक करता है लेकिन अन्य OS पर tarइसका मतलब GNU टार है।
अट्टमू

5

शक्तिशाली पाठ-आधारित फ़ाइल प्रबंधक mc (मिडनाइट कमांडर, पुराने DOS समय के नॉर्टन कमांडर को याद दिलाते हुए अस्पष्ट रूप से) के पास निरीक्षण और अनपैकिंग .rpm और .rpms फ़ाइलों की अंतर्निहित क्षमता है, बस ".rpm (s) फ़ाइल खोलें"। एमसी के भीतर और चुनें CONTENTS.cpio: एक आरपीएम के लिए आपको इंस्टॉल ट्री तक पहुंच मिलती है, एक आरपीएम के लिए आपको .spec फ़ाइल और सभी स्रोत पैकेजों तक पहुंच मिलती है।


3

अपने आरपीएम को डिबग / निरीक्षण करने के लिए मैं रेडलाइन का उपयोग करने का सुझाव देता हूं जो एक जावा प्रोग्राम है

उपयोग:

java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm

डाउनलोड करें: https://github.com/craigwblake/redline/releases



1

OpenSuse में कम से कम, unrpmकमांड buildपैकेज के साथ आता है ।

एक उपयुक्त निर्देशिका में (क्योंकि यह एक आर्काइव बम है):

unrpm file.rpm

1

एक अलग फ़ोल्डर में .rpm फ़ाइल को कॉपी करें फिर निम्न कमांड $ yourfile.rpm चलाएं cpio -idmv


यह टिप्पणी की जानी चाहिए
केतन

1

"एक्सज़" केस सेंसिटिव होने के कारण "grep" चेक के कारण "DECOMPRESSION" टेस्ट इसके लिए सबसे उपयोगी प्लेटफार्मों में से एक, सिगविन पर विफल रहता है। "समझौता:" चेक का परिणाम है:

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

बस हर जगह 'grep -q' को 'grep -q -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-ज़िप सामग्री निकालने में सक्षम है। यह उसी तरह काम करता है जैसे कि एक tar.gz फ़ाइल काम करती है। एक संपीड़ित फ़ाइल के अंदर एक संपीड़ित फ़ाइल।

विंडोज 7 प्रो पर 7-ज़िप स्थापित के साथ:

Rpm फाइल पर राइट क्लिक करें। संदर्भ मेनू में 7 से अधिक ज़िप माउस। "फ़ाइल नाम" के लिए अर्क चुनें।

फ़ाइल नाम फ़ोल्डर में दर्ज करें।

Cpio फ़ाइल पर राइट क्लिक करें। संदर्भ मेनू में 7 से अधिक ज़िप माउस। "फ़ाइल नाम" के लिए अर्क चुनें।

आप कर चुके हैं। "फ़ाइल नाम" वाले फ़ोल्डर में निरीक्षण के लिए निकाली गई सामग्री है।

मुझे पता है कि लिनक्स के लोग चीजों को आसान बनाने से घृणा करते हैं, लेकिन लंबे समय में, अगर आपको इस तरह की एक सरल समस्या के समाधान का शिकार करने के लिए समय बिताना पड़ता है; वह अक्षमता आपको पैसा खर्च कर रही है।

इस तथ्य को देखते हुए कि आप लिनक्स लोग कुशल सादगी का तिरस्कार करते हैं, मुझे अत्यधिक संदेह है कि 7-ज़िप का लिनक्स संस्करण ठीक उसी तरह से काम करेगा।

जब आप नीच बेवकूफ को कठिन बना सकते हैं और एक ही समय में प्रतिभाशाली होने का दावा कर सकते हैं तो इसे आसान क्यों बनाएं?

केवल स्पष्ट करने के लिए; मैं एक विंडोज फैनबॉय नहीं हूं। मैं वास्तव में लिनक्स पर जा रहा हूँ। मैं बस रगड़ने के अवसर का विरोध नहीं कर सका कि विंडोज डेवलपर्स को सामान्य ज्ञान के रूप में क्या देखना होगा, सबसे अच्छा डेवलपर आपके चेहरे पर अभ्यास करता है।

बस मुझे खुशी है कि यह मुझे पोस्ट कर रहा है और आपके पास मार्क हारमोन नहीं है जो आपके कारण है; विशेष एजेंट लेरॉय जेथ्रो गिब्स ने आपके सिर का उपयोग न करने के लिए आपको एक सिर का थप्पड़ दिया होगा।

मुझे नहीं पता कि यह कौन सा गिब्स नियम है, लेकिन नियम यह है कि चीजों को अपने लिए कठिन न बनाएं, जैसा कि उन्हें होना चाहिए।

अब हमें यह देखने को मिलता है कि छुट्टी लेने की जरूरत किसे है। ख्याल रखना!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.