postinst
脚本。如何获取现有的DEB,提取内容(包括控制信息),然后重新打包内容以创建新的DEB?我只会编辑文件,不会添加或删除任何文件。
#1 楼
操作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 Pack是标准格式的文件:它们是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而不是使用Shell工具。
dpkg-dev-el
软件包(由于它是本机Debian软件包,它是其自身的上游)包含用于编辑.deb
文件和编辑Debian变更日志的模式。 Emacs可以交互使用或编写脚本。评论
您也可以使用fpm的-e开关来更改控制文件:fpm -e -s deb -t deb ../old.deb。这将在编辑器中打开控制文件。
– Artefacto
2014年6月30日13:33
顺便说一句,fakeroot bash并尝试发出有关所有权的命令将不起作用,并且ar方法对于大的deb文件来说速度很快!
–水瓶座力量
16-10-6在2:53
谢谢。这很有用。使用dpkg-deb -R保留模式,并且dpkg-deb -b将提取文件的uid:gid重置为0:0。不需要fakeroot(我想如果存档中设置了{u,g} id文件,可能会出现问题,但我的情况并非如此。
– PSkocik
18年8月16日在10:52
@PSkocik不仅是setxid文件,例如/ etc或/ var下需要属于特定组的文件和目录。
–吉尔斯'所以-不再是邪恶的'
18年8月16日在19:33
感谢您的出色回答。有没有办法确保重建的软件包与原始软件包具有相同的md5sum?
– AmaJayJB
19-10-22在13:35
#2 楼
您可以将fpm与--after-install
选项一起使用来替换postinst
脚本,如下所示:fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
评论
要在Debian / Ubuntu上安装fpm:sudo apt-get install ruby-dev build-essential; sudo gem install fpm
–克雷格·安德森(Craig S. Anderson)
18年5月24日在21:47
#3 楼
如果只想从.deb文件中提取文件,则7-Zip很方便。 7-Zip支持“ ar”文件用于“仅解包”。 (无需重命名该文件;它会将* .deb打开为“ ar”,并在其中显示“ data.tar”。)评论
欢迎来到该站点,并感谢您的贡献。请注意,OP专门要求“拆包DEB ...并重新包装DEB”。也许您也可以编辑帖子以解决该主题。
– AdminBee
20年5月20日在6:31
评论
可以通过午夜指挥官(apt install mc)完成解压缩部分—只需在deb文件上按Enter