如何提取并解压shell脚本文件中内嵌的tgz压缩包
从嵌套tar.gz的Shell脚本中提取压缩包的方法
这类封装了压缩包的Shell构建文件,统一结构为「前半段Shell逻辑 + 后半段tar.gz二进制内容」,可以通过以下几种方法提取压缩包:
已知脚本内分隔标记的情况
大部分打包脚本都会在Shell代码和压缩包之间设置唯一的分隔标记(比如常见的exit 0、自定义字符串__ARCHIVE_FOLLOWS__等)
- 先查看脚本前半段的Shell代码,找到压缩包起始位置前的最后一行唯一标记
- 用sed提取标记行之后的所有内容,保存为tgz文件:
sed '1,/^__ARCHIVE_FOLLOWS__$/d' your_script.sh > extracted.tar.gz - 提取完成后可正常解压:
tar zxvf extracted.tar.gz
未知分隔标记的通用提取方法
tar.gz文件有固定的二进制文件头(十六进制特征为1f 8b 08),可以直接定位特征头的位置提取内容:
- 用grep定位第一个gzip头的偏移量:
OFFSET=$(grep -obUaP "\x1f\x8b\x08" your_script.sh | head -n1 | cut -d: -f1) - 从偏移量位置开始提取内容:
tail -c +$((OFFSET+1)) your_script.sh > extracted.tar.gz - 验证提取结果:
file extracted.tar.gz
如果输出显示为gzip compressed data即说明提取成功,可正常解压使用。
注意:如果提取后的tar.gz解压报错,可调整
head -n1的数值为2、3重试,部分脚本可能在Shell代码段包含gzip头的特征字符,取第二个/第三个匹配结果即可定位到真实压缩包的起始位置。
标准自解压脚本快捷操作
如果你的脚本是按照标准自解压规范打包的,直接执行时加上--keep或--no-execute参数通常可以直接保留提取后的压缩包,无需手动拆分,可执行sh your_script.sh --help查看脚本支持的参数说明。
内容的提问来源于stack exchange,提问作者Abhishek Surpur
相关产品推荐
相关产品推荐

