La commande principale pour manipuler les paquets deb est dpkg-deb
.
Pour décompresser le package, créez un répertoire vide et basculez vers celui-ci, puis exécutez-le dpkg-deb
pour extraire ses informations de contrôle et les fichiers du package. Utilisez dpkg-deb -b
pour reconstruire le paquet.
mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb
Attention, à moins que votre script ne soit exécuté en tant que root, les autorisations et la propriété des fichiers seront corrompues à l'étape d'extraction. Une façon d'éviter cela consiste à exécuter votre script sous fakeroot
. Notez que vous devez exécuter la séquence entière sous fakeroot
, et non pas dpkg-deb
individuellement, car c'est le fakeroot
processus qui conserve la mémoire des autorisations des fichiers qui ne peuvent pas être créés tels quels.
fakeroot sh -c '
mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb
'
Plutôt que de gâcher les autorisations, vous pouvez conserver l’archive de données et ne modifier que l’archive de contrôle. dpkg-deb
ne fournit pas un moyen de le faire. Heureusement, les paquets deb sont dans un format standard: ce sont des ar
archives. Vous pouvez donc utiliser ar
pour extraire l’archive de contrôle, modifier ses fichiers et utiliser à ar
nouveau pour remplacer l’archive de contrôle par une nouvelle version.
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
Vous devez ajouter une entrée de journal des modifications et modifier le numéro de version si vous modifiez un élément du package. L'infrastructure permettant de manipuler les paquets Debian suppose que si deux paquets ont le même nom et la même version, ils ont le même paquet. Ajoutez un suffixe à la partie debian_revision à la fin du numéro de version; pour des raisons de tri, le suffixe doit commencer par ~
, par exemple, 1.2.3-4.1
devient 1.2.3-4.1~johnjumper1
.
Au lieu d'utiliser des outils shell, vous pouvez utiliser Emacs. Le dpkg-dev-el
paquet (qui est son propre amont car il s’agit d’un paquet Debian natif) contient des modes pour éditer les .deb
fichiers et éditer les journaux des modifications Debian. Emacs peut être utilisé de manière interactive ou par script.
-e
commutateur de FPM pour modifier le fichier de contrôle:fpm -e -s deb -t deb ../old.deb
. Cela ouvrira le fichier de contrôle dans votre éditeur.fakeroot bash
et essayer d'émettre des commandes ne fonctionnera pas en ce qui concerne la propriété, et laar
méthode est incroyablement rapide pour les gros fichiers deb!dpkg-deb -R
des modes ont été conservés etdpkg-deb -b
réinitialiser leuid:gid
des fichiers extraits à0:0
. Je n'avais pas besoin de fakeroot (j'imagine qu'il pourrait y avoir des problèmes s'il y avait des fichiers {u, g} id placés dans les archives, mais ce n'était pas le cas dans ma situation./etc
ou/var
devant appartenir à un groupe spécifique.Vous pouvez utiliser fpm avec l'
--after-install
option de remplacement dupostinst
script, comme ceci:la source