O principal comando para manipular pacotes deb é dpkg-deb
.
Para descompactar o pacote, crie um diretório vazio e mude para ele, depois execute dpkg-deb
para extrair suas informações de controle e os arquivos do pacote. Use dpkg-deb -b
para reconstruir o pacote.
mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb
Cuidado, a menos que seu script esteja sendo executado como root, as permissões e a propriedade dos arquivos serão corrompidas no estágio de extração. Uma maneira de evitar isso é executar seu script em fakeroot
. Observe que você precisa executar a sequência inteira em fakeroot
, não cada uma dpkg-deb
individualmente, pois é o fakeroot
processo que mantém a memória das permissões dos arquivos que não podem ser criados como estão.
fakeroot sh -c '
mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb
'
Em vez de mexer nas permissões, você pode manter intacto o arquivo de dados e modificar apenas o arquivo de controle. dpkg-deb
não fornece uma maneira de fazer isso. Felizmente, os pacotes deb estão em um formato padrão: são ar
arquivos. Portanto, você pode usar ar
para extrair o arquivo de controle, modificar seus arquivos e usar ar
novamente para substituir o arquivo de controle por uma nova versão.
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
Você deve adicionar uma entrada no changelog e alterar o número da versão se modificar alguma coisa no pacote. A infraestrutura para manipular pacotes Debian pressupõe que, se dois pacotes tiverem o mesmo nome e versão, eles serão o mesmo pacote. Adicione um sufixo à parte debian_revision no final do número da versão; por razões de classificação, o sufixo deve começar com ~
, por exemplo, 1.2.3-4.1
torna-se 1.2.3-4.1~johnjumper1
.
Em vez de usar ferramentas de shell, você pode usar o Emacs. O dpkg-dev-el
pacote (que é o seu próprio upstream, pois é um pacote Debian nativo) contém modos para editar .deb
arquivos e editar os registros de alterações da Debian. O Emacs pode ser usado interativamente ou com script.
-e
interruptor de fpm para mudar o arquivo de controle:fpm -e -s deb -t deb ../old.deb
. Isso abrirá o arquivo de controle no seu editor.fakeroot bash
e tentar emitir comandos não funcionará em relação à propriedade, e oar
método é incrivelmente rápido para grandes arquivos deb!dpkg-deb -R
os modos foram mantidos edpkg-deb -b
redefinir osuid:gid
arquivos extraídos para0:0
. Não precisava fakeroot (imagino que pode haver problemas se não foram definidos {u, g} arquivos de identificação dentro do pacote, mas que não era o caso na minha situação./etc
ou/var
que precisam pertencer a um grupo específico.Você pode usar o fpm com a
--after-install
opção de substituir opostinst
script, assim:fonte