Основная команда для управления пакетами DEB является dpkg-deb
.
Чтобы распаковать пакет, создайте пустой каталог и переключитесь на него, затем запустите, dpkg-deb
чтобы извлечь его управляющую информацию и файлы пакета. Используйте dpkg-deb -b
для перекомпоновки пакета.
mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb
Помните, что если ваш сценарий не запущен от имени пользователя root, права доступа и владение файлами будут повреждены на этапе извлечения. Один из способов избежать этого - запустить ваш скрипт fakeroot
. Обратите внимание, что вам нужно запускать всю последовательность fakeroot
, а не каждую по dpkg-deb
отдельности, поскольку именно этот fakeroot
процесс хранит в памяти разрешения файлов, которые не могут быть созданы такими, какие они есть.
fakeroot sh -c '
mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb
'
Вместо того, чтобы связываться с разрешениями, вы можете сохранить архив данных без изменений и изменять только контрольный архив. dpkg-deb
не предоставляет способ сделать это. К счастью, пакеты deb находятся в стандартном формате: они являются ar
архивами. Таким образом, вы можете использовать, ar
чтобы извлечь контрольный архив, изменить его файлы и использовать ar
снова, чтобы заменить контрольный архив новой версией.
mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# edit postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz
Вы должны добавить запись в журнал изменений и изменить номер версии, если вы что-то изменили в пакете. Инфраструктура для работы с пакетами Debian предполагает, что если два пакета имеют одинаковые имя и версию, это один и тот же пакет. Добавьте суффикс к части debian_revision в конце номера версии; по причинам сортировки суффикс должен начинаться с ~
, например, 1.2.3-4.1
становится 1.2.3-4.1~johnjumper1
.
Вместо использования инструментов оболочки вы можете использовать Emacs. dpkg-dev-el
Пакет (который является его собственным вверх по течению , как это родной пакет Debian) содержит режимы для редактирования .deb
файлов и редактирование списков изменений Debian. Emacs можно использовать в интерактивном режиме или по сценарию.
-e
переключатель FPM изменить файл управления:fpm -e -s deb -t deb ../old.deb
. Это откроет контрольный файл в вашем редакторе.fakeroot bash
и попытка выдать команды не будет работать в отношении владения, и этотar
метод невероятно быстр для больших файлов deb!dpkg-deb -R
помощью режимов были сохранены иdpkg-deb -b
сброшеныuid:gid
извлеченные файлы в0:0
. Не нуждался в fakeroot (я думаю, что могут быть проблемы, если внутри архива есть файлы с установленными идентификаторами {u, g}, но это не так в моей ситуации./etc
или/var
которые должны принадлежать к определенной группе.Вы можете использовать fpm с
--after-install
возможностью заменыpostinst
скрипта, например так:источник