归档与压缩解决的是不同问题。归档把目录树及其元数据组合成一个数据流;压缩则对数据流重新编码以减小体积。.tar.gz 文件通常是数据流经过 gzip 压缩的 tar 归档。
软件包 · 第 3 课
tar 与 gzip
学习如何用 `tar` 归档文件、用 `gzip` 压缩数据流,并在安全提取前检查归档。
使用 `gzip` 压缩单个数据流
默认情况下,gzip 会压缩文件,并用一个 .gz 文件替换原来的名称:
$ gzip report.txt
成功创建 report.txt.gz 后,通常会移除 report.txt。使用以下命令解压:
$ gunzip report.txt.gz
在支持的系统上,可以用 gzip -k report.txt 保留输入文件;需要明确控制时,也可以使用标准流。文件扩展名只是一种约定,不能证明实际格式;file 等工具可以检查内容。
本课中 gzip 的主要作用是什么?
创建 Tar 归档
使用以下命令创建未压缩归档:
$ tar -cvf project.tar file1 file2 directory1
-c创建新归档。-v在处理时列出成员,可省略。-f project.tar指定归档文件;由于-f会使用一个参数,应把文件名紧跟在它旁边。
路径会作为归档成员名称保存。应从有意识选择的工作目录创建归档,避免意外收录密钥、缓存、套接字或范围过大的绝对路径。
哪个 tar 选项用于创建新归档?
创建 Gzip 压缩的 Tar 归档
GNU tar 和许多其他实现可以通过 -z 调用 gzip:
$ tar -czvf project.tar.gz file1 file2 directory1
结果是一个经过 gzip 压缩的 tar 数据流。压缩不会加密归档,也无法向能够读取并解压它的人隐藏内容。如果需要保密性,应采用适当的认证加密流程,并单独管理密钥。
所示 tar 命令中的 -z 请求什么?
提取前先列出内容
应把他人提供的归档视为不受信任输入。先列出成员名称:
$ tar -tzf download.tar.gz
检查意外的绝对路径、.. 路径穿越组成部分、可疑的符号链接或硬链接、设备文件,以及会覆盖重要文件的名称。现代 tar 实现会提供一定保护,但行为和选项不尽相同,而且提取仍会创建攻击者选择的名称与内容。
应提取到新创建的非特权暂存目录:
$ mkdir extraction-stage
$ tar -xzf download.tar.gz -C extraction-stage
不要以 root 身份提取未经审查的归档。把选定文件移到最终位置前,应先核实实际创建的内容。
哪个操作只列出归档成员而不提取?
其他压缩格式
Tar 实现还可以配合 bzip2 和 xz 等压缩程序;在 GNU tar 中通常分别用 -j 和 -J 选择。格式支持和自动检测会有差异,因此应查阅 tar --help 或本机手册。ZIP 是另一种归档格式,使用 zip 和 unzip 等工具操作。
Gzip 压缩会让 tar 归档具有保密性吗?
可以先在文件打包和压缩实验中使用可丢弃文件练习,再在使用 tar 创建和恢复备份实验中应用检查和暂存流程。
课程已完成
你已完成 tar 与 gzip
现在,你可以安全地把 tar 归档与 gzip 压缩结合使用。
区分 tar 归档与 gzip 压缩。
使用
-c创建归档,使用-z处理 gzip 数据流。提取前先用
-t列出成员,再用-x提取。把不受信任内容提取到非特权暂存目录。
将压缩与加密视为不同概念。