Как извлечь содержимое оборотов в минуту?
У меня есть rpm, и я хочу относиться к нему как к тарболу. Я хочу извлечь содержимое в каталог, чтобы я мог проверить содержимое. Я знаком с командами запроса неустановленного пакета. Я не просто хочу список содержимого rpm. т.е.
$ rpm -qpl foo.rpm
Я хочу проверить содержимое нескольких файлов, содержащихся в rpm. Я не хочу устанавливать RPM. Мне также известно о способности rpms вносить дополнительные изменения в разделы% post и о том, как их проверять. т.е.
$ rpm -qp --scripts foo.rpm
Однако в этом случае это меня не касается.
20 ответов
Вы пробовали 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
Для тех, у кого нет 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
Иногда вы можете столкнуться с проблемой с промежуточным архивом RPM:
cpio: искаженное число
cpio: искаженное число
cpio: искаженное число
,,,
cpio: преждевременное завершение архива
Это означает, что это может быть упаковано, в наши дни это сжатие LZMA2, как обычно, xz
:
rpm2cpio <file>.rpm | xz -d | cpio -idmv
в противном случае вы можете попробовать:
rpm2cpio <file>.rpm | lzma -d | cpio -idmv
В большинстве дистрибутивов установлен файл-ролик приложения с графическим интерфейсом, который распаковывает tar, zip, rpm и многие другие.
file-roller --extract-here package.rpm
Это позволит извлечь содержимое в текущем каталоге.
7-zip понимает большинство видов архивов, включая rpm и включенный cpio.
Как сообщается здесь:https://bugzilla.redhat.com/show_bug.cgi?id=2058426
RHEL 9 использует сжатие полезной нагрузки (zstd).
rpm2cpio foo.rpm | zstd -d | cpio -idmv
Мощный текстовый файловый менеджер mc (Midnight Commander, смутно напоминающий Norton Commander о старых временах DOS) обладает встроенной возможностью проверять и распаковывать файлы.rpm и.rpms, просто "открывая" файл.rpm(s) в MC и выберите CONTENTS.cpio
: для RPM вы получаете доступ к дереву установки, для RPM вы получаете доступ к файлу.spec и всем исходным пакетам.
Для отладки / проверки вашего RPM я предлагаю использовать Redline, который является Java-программой
Использование:
java -cp redline-1.2.1-jar-with-dependencies.jar org.redline_rpm.Scanner foo.rpm
В NixOS есть rpmextract
, Это обертка вокруг rpm2cpio, именно так, как хотел @Alan Evangelista. https://github.com/NixOS/nixpkgs/tree/master/pkgs/tools/archivers/rpmextract
По крайней мере, в OpenSuse unrpm
Команда приходит с build
пакет.
В подходящем каталоге (потому что это архивная бомба):
unrpm file.rpm
Скопируйте файл.rpm в отдельную папку, затем выполните следующую команду $ yourfile.rpm | cpio -idmv
7-Zip умеет извлекать содержимое. Он работает так же, как файл tar.gz. Сжатый файл внутри сжатого файла.
В Windows 7 Pro с установленным 7-Zip:
Щелкните правой кнопкой мыши файл rpm. Наведите указатель мыши на 7-Zip в контекстном меню. Выберите извлечь в "имя файла".
Войдите в папку с именем файла.
Щелкните правой кнопкой мыши файл cpio. Наведите указатель мыши на 7-Zip в контекстном меню. Выберите извлечь в "имя файла".
Вы сделали. Папка с именем "filename" содержит извлеченное содержимое для проверки.
Я знаю, что вы, ребята, Linux, презираете то, что упрощается, но в конечном итоге, если вам придется потратить время на поиск решения такой простой проблемы; эта неэффективность стоит денег.
Учитывая тот факт, что вы, парни, Linux, презираете эффективную простоту, я очень сомневаюсь, что версия 7-Zip для Linux будет делать то же самое точно так же.
Зачем упрощать, если можно сделать совершенно глупую сложность и в то же время заявить, что ты гений?
Просто быть чистым; Я не фанат Windows. Я действительно собираюсь перейти на Linux. Я просто не мог устоять перед возможностью втирать вам в лицо то, что разработчики Windows сочли бы здравым смыслом и передовыми методами разработки.
Просто радуйтесь, что это я публикую, а рядом с вами нет Марка Хармона, потому что; Специальный агент Лерой Джетро Гиббс дал бы вам пощечину за то, что вы не использовали свою голову.
Я не знаю, какое это правило Гиббса, но правило таково: не усложняйте себе жизнь сложнее, чем должно быть.
Теперь посмотрим, кому нужно взять отпуск. Береги себя!
Если в вашей системе естьrpm2archive
установлен, вы можете запустить:
rpm2archive package.rpm
Это преобразует пакет rpm в сжатый архив tar.package.rpm.tgz
. Теперь вы можете извлечь его, используя:
tar -xvf package.rpm.tgz
Ранее это отмечал Hi-Angel в своем комментарии.
Источники:
- man-страница rpm2archive
- Он был выпущен с rpm 4.12.0-alpha (он довольно новый)
- В Debian и его производных он включен в
rpm2cpio
упаковка.
Тест "DECOMPRESSION" не проходит на CygWin, одной из наиболее потенциально полезных платформ для него, из-за проверки "grep" на наличие "xz" с учетом регистра. Результат проверки "СЖАТИЕ:":
COMPRESSION='/dev/stdin: XZ compressed data'
Простая замена "grep -q" на "grep -q -i" везде, кажется, хорошо решает проблему.
Я сделал несколько обновлений, в частности добавил несколько комментариев и использовал "case" вместо сложенных "if" утверждений, и включил это исправление ниже
#!/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
Если вы попробовалиrpm2cpio.sh
сценарий выше, и он не сработал, вы можете сохранить следующий сценарий и вызвать его следующим образом:rpm2cpio.sh rpmname | cpio -idmv
, на моем работаетCentOS 7
.
#!/bin/sh -efu
fatal() {
echo "$*" >&2
exit 1
}
pkg="$1"
[ -n "$pkg" ] && [ -e "$pkg" ] ||
fatal "No package supplied"
_dd() {
local o="$1"; shift
dd if="$pkg" skip="$o" iflag=skip_bytes status=none $*
}
calcsize() {
case "$(_dd $1 bs=4 count=1 | tr -d '\0')" in
"$(printf '\216\255\350')"*) ;; # '\x8e\xad\xe8'
*) fatal "File doesn't look like rpm: $pkg" ;;
esac
offset=$(($1 + 8))
local i b b0 b1 b2 b3 b4 b5 b6 b7
i=0
while [ $i -lt 8 ]; do
# add . to not loose \n
# strip \0 as it gets dropped with warning otherwise
b="$(_dd $(($offset + $i)) bs=1 count=1 | tr -d '\0' ; echo .)"
b=${b%.} # strip . again
[ -z "$b" ] &&
b="0" ||
b="$(exec printf '%u\n' "'$b")"
eval "b$i=\$b"
i=$(($i + 1))
done
rsize=$((8 + ((($b0 << 24) + ($b1 << 16) + ($b2 << 8) + $b3) << 4) + ($b4 << 24) + ($b5 << 16) + ($b6 << 8) + $b7))
offset=$(($offset + $rsize))
}
case "$(_dd 0 bs=4 count=1 | tr -d '\0')" in
"$(printf '\355\253\356\333')"*) ;; # '\xed\xab\xee\xdb'
*) fatal "File doesn't look like rpm: $pkg" ;;
esac
calcsize 96
sigsize=$rsize
calcsize $(($offset + (8 - ($sigsize % 8)) % 8))
hdrsize=$rsize
case "$(_dd $offset bs=2 count=1 | tr -d '\0')" in
"$(printf '\102\132')") _dd $offset | bunzip2 ;; # '\x42\x5a'
"$(printf '\037\213')") _dd $offset | gunzip ;; # '\x1f\x8b'
"$(printf '\375\067')") _dd $offset | xzcat ;; # '\xfd\x37'
"$(printf '\135')") _dd $offset | unlzma ;; # '\x5d\x00'
"$(printf '\050\265')") _dd $offset | unzstd ;; # '\x28\xb5'
*) fatal "Unrecognized payload compression format in rpm file: $pkg" ;;
esac
Если у вас естьrpmdevtools
установлен, вы также можете извлечь файл пакета RPM с помощью всего одной команды:
rpmdev-extract foo.rpm
просто запустите это:
$rpm -ivh package_name.rpm
если у вас нет прав суперпользователя, используйте
sudo -i
затем выполните эту команду.
если у вас нет пакета rpm, установите пакет rpm.