我有一个自制存档,我想看看里面有什么,即。将提取哪些文件,而不是实际运行其脚本部分。我怎么做?
我宁愿不实际提取任何内容,但如果这是唯一的方法,那么我愿意进行提取 - 只要其中的 (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 存储库
答案2
自制存档由三部分组成:
- 一个 shell 脚本。
- gzip 压缩的 tar 存档。
- (可选)最后有更多数据。
通常,当您运行存档时,它会执行 shell 脚本,该脚本会将嵌入的存档提取到临时目录中,然后执行从存档中提取的特定文件。该脚本包含有关其自身大小和 tar 文件大小的信息,这使得它能够提取中间嵌入的 tar 文件。
(“最后的更多数据”可以是任何内容。例如,对于 GoG 安装程序,它包含一个包含实际游戏内容的 zip 文件。这些文件可以使用 来提取unzip
,完全绕过 makeself。这是有效的,因为 zip 文件使用相对偏移量到文件末尾。)
如果您在less
Linux 上打开该文件,您可以看到脚本的内容,它告诉您需要知道的所有信息。靠近顶部,应该有一行类似:
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 中。