如何在不运行 makeself 存档的情况下列出它的内容?

如何在不运行 makeself 存档的情况下列出它的内容?

我有一个自制存档,我想看看里面有什么,即。将提取哪些文件,而不是实际运行其脚本部分。我怎么做?

我宁愿不实际提取任何内容,但如果这是唯一的方法,那么我愿意进行提取 - 只要其中的 (ba)sh 代码都没有实际运行。

答案1

生成的存档有一个--list选项,您可以使用它来列出其内容。

作为参考,我正在讨论 Debian 中的这个版本:

ii  makeself       2.2.0-1      all          utility to generate self-extractables

它在脚本中生成这个块:

MS_Help()
{   
    cat << EOH >&2 
Makeself version 2.2.0 
 1) Getting help or info about $0 : 
  $0 --help   Print this message 
  $0 --info   Print embedded info : title, default target directory, embedded script ... 
  $0 --lsm    Print embedded lsm entry (or no LSM) 
  $0 --list   Print the list of files in the archive 
  $0 --check  Checks integrity of the archive 

 2) Running $0 : 
  $0 [options] [--] [additional arguments to embedded script] 
  with following options (in that order) 
  --confirm             Ask before running embedded script 
  --quiet               Do not print anything except error messages 
  --noexec              Do not run embedded script 
  --keep                Do not erase target directory after running 
                        the embedded script 
  --noprogress          Do not show the progress during the decompression 
  --nox11               Do not spawn an xterm 
  --nochown             Do not give the extracted files to the current user 
  --target dir          Extract directly to a target directory 
                        directory path can be either absolute or relative 
  --tar arg1 [arg2 ...] Access the contents of the archive through the tar command 
  --                    Following arguments will be passed to the embedded script 
EOH
}

它的手册页需要一些工作,但脚本很容易阅读 - 请参阅git 存储库

进一步阅读:makeself - 在 Unix 上制作可自解压的档案

答案2

自制存档由三部分组成:

  1. 一个 shell 脚本。
  2. gzip 压缩的 tar 存档。
  3. (可选)最后有更多数据。

通常,当您运行存档时,它会执行 shell 脚本,该脚本会将嵌入的存档提取到临时目录中,然后执行从存档中提取的特定文件。该脚本包含有关其自身大小和 tar 文件大小的信息,这使得它能够提取中间嵌入的 tar 文件。

(“最后的更多数据”可以是任何内容。例如,对于 GoG 安装程序,它包含一个包含实际游戏内容的 zip 文件。这些文件可以使用 来提取unzip,完全绕过 makeself。这是有效的,因为 zip 文件使用相对偏移量到文件末尾。)

如果您在lessLinux 上打开该文件,您可以看到脚本的内容,它告诉您需要知道的所有信息。靠近顶部,应该有一行类似:

filesizes="12345"

这告诉您嵌入式 tar 文件的长度为 12345 字节。 (理论上,filesizes可以列出多个文件的大小,但实际上,一个存档包含多个文件的情况似乎很少见。)

如果您随后搜索head,您应该会找到如下行:

offset=`head -n 519 "$1" | wc -c | tr -d " "`

这是脚本用来计算其自身大小的逻辑。正如您所看到的,脚本知道它有 519 行长。

现在您知道了脚本的大小(以行为单位)和嵌入式 tar 存档的大小(以字节为单位),您可以按如下方式列出嵌入式存档的内容:

tail +520 ~/Downloads/gog_huniepop_2.0.0.3.sh | head -c 12345 | tar tz

tail +N将列出从 line 开始的文件内容N。我们使用 520,它比 519 多 1,因为我们只想开始脚本的末尾(因此不包括最后一行)。

一些注意事项:

  • 如果您想提取文件(而不仅仅是列出它们),请tar xz使用tar tz.您可能想在空目录中执行此操作!
  • 在 BSD 上,tar 默认从磁带设备而不是 stdin 读取。tar tzf -在这种情况下使用。

答案3

就我而言,这很简单

makeself_archive.sh --tar xf

这会将存档的内容提取到 PWD 中。

相关内容