在没有 `dpkg` 的情况下打开 Debian 包文件

Rui*_*iro 2 osx debian deb

我需要deb在 MacOS High Sierra 中打开一个 Debian包文件,以便将二进制文件与我在 Linux 中安装的二进制文件进行比较。

其实包是 mssql-server_14.0.3008.27-1_amd64.deb

file命令说Debian binary package (format 2.0)

tar x并且unzip不工作。

该怎么办?

Rui*_*iro 6

实际.deb文件的外层实际上是一个ar存档。

由于解包/打开它会生成一些文件,我们最好将其移动到一个目录:

$ mkdir debtmp
$ mv mssql-server_14.0.3008.27-1_amd64.deb 
$ cd debtmp
Run Code Online (Sandbox Code Playgroud)

因此,作为第一步,要打开它,我们执行以下操作:

$ ar xv mssql-server_14.0.3008.27-1_amd64.deb 
x - debian-binary
x - control.tar.gz
x - data.tar.xz
Run Code Online (Sandbox Code Playgroud)

至于生成的文件,debian-binary只包含 .deb 格式版本:

$ cat debian-binary 
2.0
Run Code Online (Sandbox Code Playgroud)

control.tar.gz包含 apt/dpkg 信息,包括 post/pre/install 脚本、依赖项和校验和文件。所以我们现在对它实际上并不感兴趣。

$ tar -tvf control.tar.gz 
drwxr-xr-x  0 root   root        0 18 Nov 04:55 ./
-rw-r--r--  0 root   root      546 18 Nov 04:55 ./control
-rw-r--r--  0 root   root       25 18 Nov 04:55 ./shlibs
-rwxr-xr-x  0 root   root      383 18 Nov 04:55 ./preinst
-rwxr-xr-x  0 root   root      107 18 Nov 04:55 ./config
-rwxr-xr-x  0 root   root      289 18 Nov 04:55 ./postrm
-rw-r--r--  0 root   root        0 18 Nov 04:54 ./templates
-rwxr-xr-x  0 root   root      251 18 Nov 04:55 ./prerm
-rw-r--r--  0 root   root       60 18 Nov 04:55 ./triggers
-rwxr-xr-x  0 root   root      771 18 Nov 04:55 ./postinst
-rw-r--r--  0 root   root     6155 18 Nov 04:55 ./md5sums
Run Code Online (Sandbox Code Playgroud)

然后我们对data.tar.zx文件更感兴趣,因为它包含配置文件和可执行文件。

首先,我们需要安装xz,使用MacPorts的,因为tar需要调用它,因为我们正在处理这个.deb文件用.tar.xz

sudo port install xz
Run Code Online (Sandbox Code Playgroud)

注意:在您可能还会处理的评论.tar.gz.tar.gz其他 .deb 文件中,我注意到了这一点——但是 macOS 带有gunzipbzip2默认并安装。

所以,解压它:

$ tar xvf data.tar.xz 
x ./
x ./opt/
x ./opt/mssql/
x ./opt/mssql/bin/
x ./opt/mssql/bin/sqlservr
x ./opt/mssql/bin/crash-support-functions.sh
[snip]
x ./usr/share/doc/mssql-server/license_Std_Linux.txt.gz
x ./usr/share/doc/mssql-server/license_Eval_Linux_Chinese (Simplified).txt.gz
x ./usr/share/doc/mssql-server/license_Std_Linux_French.txt.gz
x ./lib/
x ./lib/systemd/
x ./lib/systemd/system/
x ./lib/systemd/system/mssql-server.service
Run Code Online (Sandbox Code Playgroud)

最后,有了本地磁盘上的所有文件,就可以从目录中获取二进制文件 opt/mssql/bin/

附加说明:根据@AustinHemmelgarn 的精彩评论,最后一步也可能会遇到其他文件中的压缩gzipbzip2代替xz压缩.deb