Created
July 7, 2016 01:46
-
-
Save adamhotep/87d14842c3bfc39359e6aa30bed63d8e to your computer and use it in GitHub Desktop.
disrpm / undeb, a small script to extract/unzip/unpack/unarchive *.rpm or *.deb packages
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# disrpm / undeb | |
# small (bourne) shell script to extract/unzip/unpack/unarchive *.rpm or *.deb packages. | |
# uses sh, sed, hexdump|od, gzip|bzip2, dd, cpio. | |
# released under the Gnu General Public License (GPL) | |
# (c) [email protected] | |
###################### | |
VER="v1.5, october 2004" | |
ME="${0##*/}" | |
# change HEADER_SIZE here or issue e.g. | |
# $> HEADER_SIZE=512000 disrpm -v foo.rpm | |
[ -z $HEADER_SIZE ] && HEADER_SIZE=256000 | |
###################### | |
usage() | |
{ | |
echo -e "disrpm $VER ([email protected]) | |
usage: $ME -v|-x foo.rpm | |
$ME -v|-x foo.deb | |
options: -v|-l view (list) contents of foo. | |
-x extract foo. | |
" | |
exit 1 | |
} | |
error_exit() | |
{ | |
echo $1 >&2 | |
exit 1 | |
} | |
gzip_sieve() | |
{ | |
# gzip-magic: 0x1F,0x8B | |
sed -ne '/1[fF]/{;N;/8[bB]$/{;s/1[fF]//g;s/^0*//g;P;};}' | |
} | |
bzip2_sieve() | |
{ | |
# bzip2-magic: 0x42,0x5A,0x68 | |
sed -ne '/42/{;N;/5[aA]$/{;N;/68$/{s/42//g;s/5[aA]//g;s/^0*//g;P;};};}' | |
} | |
probe() | |
{ | |
dd if=$FILE ibs=$O skip=1 2>/dev/null \ | |
| $2 -dc - 2>/dev/null \ | |
| cpio "$1" 2>/dev/null | |
} | |
###################### | |
XDUMP=`type -P hexdump` || XDUMP=`type -P od` || error_exit "oops, can't find hexdump or od -- bailing out" | |
XDUMP="${XDUMP##*/}" | |
OPT=$1 | |
[ -z $OPT ] && usage | |
PASS1="probe -tv" | |
{ [ "$OPT" = "-l" -o "$OPT" = "-v" ] && PASS2=":" ; } || { [ "$OPT" = "-x" ] && PASS2="probe -mid" ; } || usage | |
FILE=$2 | |
[ x"$FILE"x == xx ] && usage | |
[ -e "$FILE" ] || error_exit "$FILE: No such file or directory" | |
for AR in gzip bzip2 | |
do | |
e=1 | |
[ "$XDUMP" = "od" ] && AR_OFFSETS=`$XDUMP -A d -N $HEADER_SIZE -v -t x1 -w1 $FILE | ${AR}_sieve` | |
[ "$XDUMP" = "hexdump" ] && AR_OFFSETS=`$XDUMP -n $HEADER_SIZE -v -e '"%_ad " 1/1 "%02x" "\n"' $FILE | ${AR}_sieve` | |
for O in $AR_OFFSETS | |
do | |
echo "--> at offset $O:" >&2 | |
$PASS1 $AR 2>/dev/null && $PASS2 $AR && e=0 \ | |
|| echo "... hmm, probably false drop" >&2 | |
done | |
[ $e -eq 0 ] && break | |
done | |
[ $e -eq 1 ] && echo "$ME: failed to find anything -- maybe HEADER_SIZE is too small (currently $HEADER_SIZE, see line 14)" >&2 | |
exit $e |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This little gem of a script seems to be nearly lost on the internet. I've seen it on iBiblio and referenced in various discussions like this Puppy Linux forum, but not in any code repository. It supposedly works better than rpm2cpio, but I haven't used it in 10+ years. I doubt it works on RPM v5 since that fork uses xar rather than cpio.
I claim neither ownership nor authorship; disrpm was written by and is copyright Bauke Jan Douma. It is posted here for convenience, as permitted by the GNU GPL. I assume, given the date given in the script, that this is GPL version 2.