Answers:
处理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
如果您在软件包中进行了任何修改,则应添加一个changelog条目并更改版本号。操作Debian软件包的基础结构假定,如果两个软件包具有相同的名称和版本,则它们是相同的软件包。在版本号末尾的debian_revision部分添加一个后缀;出于排序原因,后缀应该以开头~,例如1.2.3-4.1变成1.2.3-4.1~johnjumper1。
您可以使用Emacs而不是使用Shell工具。该dpkg-dev-el软件包(由于它是本机Debian软件包,因此是其自己的上游)包含用于编辑.deb文件和编辑Debian变更日志的模式。Emacs可以交互使用或编写脚本。
fakeroot bash并尝试发出有关所有权的命令将不起作用,并且这种ar方法对于大的deb文件来说速度很快!
                    dpkg-deb -R保留使用模式,并将提取的文件dpkg-deb -b重置uid:gid为0:0。不需要fakeroot(我想如果存档中设置了{u,g} id文件,可能会出现问题,但我的情况并非如此
                    /etc或/var需要属于特定组的文件和目录。
                    您可以将fpm与该--after-install选项一起使用来替换postinst脚本,如下所示:
fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb
-e开关更改控制文件:。这将在编辑器中打开控制文件。fpm -e -s deb -t deb ../old.deb