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