linux压缩与解压缩

压缩和解压缩

一、系统运维

1、日志管理 定期压缩旧日志节省空间

# 查找并压缩30天前的日志
find /var/log -name "*.log" -mtime +30 -exec gzip -v {} \;

# 进阶方案:压缩后删除原文件(节省空间)
find /var/log -name "*.log" -mtime +30 -exec sh -c 'gzip -v "{}" && rm -f "{}"' \;

# 定时任务(每月1号执行)
0 0 1 * * /usr/bin/find /var/log -name "*.log" -mtime +30 -exec gzip {} \;

应用场景

  • Apache/Nginx日志归档
  • 应用服务日志轮转
  • 审计日志长期保存

关键参数

  • -mtime +30:30天前的文件
  • -exec:对找到的文件执行操作
  • gzip -v:显示压缩详情

2、备份操作

cp 原文件 备份文件.back 
tar -g /backup/snamshot -czvf backup
# 完整备份(带时间戳)
tar -czvf backup_full_$(date +%F).tar.gz /data

# 增量备份(需先创建快照)
tar -g /backup/snapshot -czvf backup_inc_$(date +%F).tar.gz /data

# 差异备份
tar -g /backup/snapshot -czvf backup_diff.tar.gz -N "$(cat /backup/snapshot)" /data

# 加密备份
tar -czvf - /sensitive_data | openssl enc -aes-256-cbc -out backup_encrypted.tar.gz.enc

恢复流程

# 解密恢复
openssl enc -d -aes-256-cbc -in backup_encrypted.tar.gz.enc | tar -xzvf -

# 增量恢复
tar -xzvf backup_full.tar.gz
tar -xzvf backup_inc_1.tar.gz
tar -xzvf backup_inc_2.tar.gz

3、软件部署

分发压缩包

# 1. 创建部署包
tar -czvf app_v2.3.tar.gz --exclude=".git" --exclude="node_modules" ./app/

# 2. 安全传输到目标服务器
scp -i ~/.ssh/deploy_key app_v2.3.tar.gz user@server:/tmp/

# 3. 远程解压部署
ssh -i ~/.ssh/deploy_key user@server "
tar -xzvf /tmp/app_v2.3.tar.gz -C /opt/apps/ &&
systemctl restart app_service
"

自动化方案

# 使用Ansible批量部署
ansible all -m copy -a "src=app_v2.3.tar.gz dest=/tmp/"
ansible all -m shell -a "tar -xzvf /tmp/app_v2.3.tar.gz -C /opt/apps/"
ansible all -m service -a "name=app_service state=restarted"

4、系统维护

# 磁盘空间监控
df -h | awk '$5 > 80% {print $6 " is " $5}'

# 内存泄漏检测
watch -n 60 'ps aux --sort=-%mem | head -10'

# 定时清理临时文件
find /tmp -type f -mtime +7 -delete

# 系统更新(滚动更新)
dnf update -y && dnf clean all

二、安全运维

1、安全审计

加密压缩敏感日志

# 压缩并加密审计日志
tar -czvf - /var/log/audit/* | gpg --symmetric --cipher-algo AES256 -o audit_$(date +%F).tar.gz.gpg

# 解密查看
gpg -d audit_2025-08-04.tar.gz.gpg | tar -xzvf -

日志完整性保护

# 生成SHA256校验值
sha256sum audit.log > audit.log.sha256

# 验证日志完整性
sha256sum -c audit.log.sha256

2、安全传输

加密传输

# 使用OpenSSL加密传输
tar -czvf - /data | openssl enc -aes-256-cbc -pass pass:密钥 | nc -l 12345

# 接收端
nc server_ip 12345 | openssl enc -d -aes-256-cbc -pass pass:密钥 | tar -xzvf -

# 使用SSH隧道
tar -czvf - /sensitive | ssh user@remote "cat > backup.tar.gz"

证书加密传输

# 公钥加密
tar -czvf - /data | openssl smime -encrypt -aes256 -binary -outform DER remote_cert.pem > data.tar.enc

# 私钥解密
openssl smime -decrypt -in data.tar.enc -inform DER -inkey private.key | tar -xzvf -

3、应急响应

快速收集系统信息

#!/bin/bash
# incident_response.sh

OUTDIR="/forensics/$(hostname)_$(date +%F_%H%M)"
mkdir -p $OUTDIR

# 系统信息
uname -a > $OUTDIR/system_info.txt
ip a > $OUTDIR/network_config.txt
ps aux > $OUTDIR/process_list.txt
netstat -tulnpe > $OUTDIR/network_connections.txt
lsof -i > $OUTDIR/open_ports.txt

# 恶意样本打包
find / -mtime -1 -type f -exec tar -rvf $OUTDIR/suspicious_files.tar {} +
gzip $OUTDIR/suspicious_files.tar

# 内存快照
dd if=/dev/mem of=$OUTDIR/memory_dump.bin bs=1M count=1024

恶意样本分析流程:

# 1. 隔离样本
mkdir /quarantine && mv suspicious_file /quarantine/

# 2. 计算哈希值
sha256sum /quarantine/suspicious_file > hashes.txt

# 3. 限制权限
chmod 400 /quarantine/suspicious_file

# 4. 打包加密
tar -czvf - /quarantine | gpg --encrypt --recipient security-team@company.com > malware_analysis.tar.gz.gpg

# 5. 上传到沙箱分析
curl -X POST -F "file=@malware_analysis.tar.gz.gpg" https://malware-analysis-api.com

生成测试文件

/dev/zero文件,能够输出无限连续的0x00字节,用作创建空白文件,初始化存储空间

/dev/null文件,是黑洞设备可以丢弃所有写入,用于屏蔽程序输出

[root@wickt tmp]# dd if=/dev/zero of=/tmp/testfile bs=1M count=100

# if=/dev/zero ,输入源为/dev/zero
# of=/tmp/testfile , 输出文件为/tmp/testfile
# bs=1M 每一块大小为1M
# count=100 添加的块的数量

[root@wickt tmp]# ls -lh testfile
-rw-r--r--. 1 root root 100M 8月 4 18:24 testfile
# -h 输出文件大小,以能看懂的形式

查看文件

[root@wickt tmp]# file test.txt
test.txt: ASCII text
[root@wickt tmp]# file testfile
testfile: data
[root@wickt tmp]# hexdump testfile
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
6400000

# 最前面 0000000 是起始偏移量
# 中间 0000 是文件数据
# * 号表示数据都和上面一样
# 最后的 6400000 表示数据结束地址

file 文件名,查看文件类型

test.txt文件中写入了单词apple用file命令查看时ASCII文件。

刚才创建的testfile文件显示为data,表示file命令无法识别该文件的具体格式。从/dev/zero文件创建的全是0的空数据,被系统理解为纯二进制的数据或是非标准格式,所以无法识别。

压缩文件

gzip命令

gzip 是 Linux/Unix 系统中一个非常常用的文件压缩工具,它使用 LZ77 和 Huffman 编码算法(DEFLATE)来减小文件大小。压缩后的文件通常以 .gz 为扩展名,并且 gzip 默认会删除原始文件(除非使用 -k 选项)。

gzip [选项] 文件名
gunzip [选项] 文件名.gz # 解压缩文件,等效于 gzip -d 命令
  1. 压缩与解压基础:

    • -c--stdout--to-stdout将压缩或解压后的输出写到标准输出(屏幕),不改变原始文件。 这是将结果通过管道传递给其他命令或保存到不同文件的关键。
      • 压缩到屏幕:gzip -c file.txt
      • 压缩并保存为新文件:gzip -c file.txt > file.txt.gz
      • 解压到屏幕:gzip -cd file.txt.gz
      • 解压并保存为新文件:gzip -cd file.txt.gz > file.txt
    • -d--decompress--uncompress解压缩文件。 这是 gunzip 命令的等效方式。
      • gzip -d file.txt.gz (解压后得到 file.txt, 并删除 file.txt.gz)
    • -k--keep压缩或解压时保留原始文件。 这是防止 gzip 默认删除源文件的关键选项。
      • gzip -k file.txt (压缩后得到 file.txt.gz, 并且 file.txt 仍然存在)
      • gzip -dk file.txt.gz (解压后得到 file.txt, 并且 file.txt.gz 仍然存在)
    • -f--force强制执行操作。
      • 强制覆盖已存在的输出文件。
      • 即使文件有多个硬链接、是终端设备或压缩数据看起来不完整也尝试压缩。
      • 当与 -c 结合使用时,即使输入数据不是常规文件(如管道、设备),也尝试压缩。
  2. 压缩级别控制 (速度 vs 压缩率):

    • -#--fast--best设置压缩级别。 # 是一个从 1 到 9 的数字。
      • -1--fast最快压缩,但压缩率最低(文件压缩后相对较大)。
      • -9--best最慢压缩,但压缩率最高(文件压缩后相对最小)。
      • -6默认压缩级别,在速度和压缩率之间取得较好的平衡。
      • 通常,级别 6-9 之间的压缩率差异不大,但级别 9 会显著增加压缩时间。级别 1 非常快,但压缩效果较差。
    选项 速度 压缩率 说明
    -1 --fast 最快 最低 牺牲压缩率换取速度
    -6 默认 默认 较好的平衡点 (默认级别)
    -9 --best 最慢 最高 牺牲速度换取最大压缩率
  3. 信息查看:

    • -l--list列出压缩文件的信息。 显示每个压缩文件的压缩大小、未压缩大小、压缩比(百分比)和未压缩文件名。不解压文件。
      • gzip -l file.txt.gz
      • 常用组合 -lv 查看更详细的信息(包括校验和、时间戳)。
    • -v--verbose详细模式。 在处理文件时显示文件名和压缩比。
      • gzip -v file.txt (压缩时显示压缩比)
      • gzip -dv file.txt.gz (解压时显示信息)
      • gzip -lv file.txt.gz (查看列表时显示更详细信息)
  4. 递归操作 (需要结合其他命令):

    • gzip 本身不能递归压缩目录及其子目录下的所有文件。 你需要先使用 tar 打包目录,然后再压缩打包后的 .tar 文件。
      • tar -czvf archive.tar.gz directory/:打包并压缩目录(常用)
      • tar -xzvf archive.tar.gz:解压 .tar.gz 文件
      • gzip 也可以直接压缩 .tar 文件:gzip archive.tar -> archive.tar.gz
  5. 文件属性:

    • -N--name解压时,如果原始文件名和文件时间戳信息存储在压缩文件中,则恢复原始文件名和时间戳。 这是默认行为。如果压缩时使用了 --no-name,则解压时需要用 -N 来强制恢复原始名和时间戳。
    • -n--no-name压缩时,不存储原始文件名和时间戳。 解压时,如果压缩文件没有存储原始名,则使用压缩文件名去掉 .gz 后缀(即使这样可能不准确)。解压时不恢复原始时间戳,使用当前时间。
    • -T--test测试压缩文件的完整性。 检查文件是否有错误,但不解压输出任何内容。如果文件完好,命令正常退出(退出码为 0)。

文件压缩

[root@wickt tmp]# gzip testfile 
[root@wickt tmp]# ls -lh testfile.gz
-rw-r--r--. 1 root root 100K 8月 4 18:24 testfile.gz

[root@wickt tmp]# file testfile.gz
testfile.gz: gzip compressed data, was "testfile", last modified: Mon Aug 4 10:24:55 2025, from Unix, original size 104857600

# testfile.gz:被检查的文件名
# gzip compressed data 文件类型是 gzip 压缩数据(符合 gzip 格式标准)
# was "testfile" 压缩前的原始文件名是 testfile,zip 在压缩时会默认记录原始文件名(除非使用 -n 选项禁用)
# last modified: Mon Aug 4 10:24:55 2025 原始文件的 最后修改时间 是 2025年8月4日 10:24:55
# from Unix 文件是在 Unix/Linux 系统 上创建的
# original size 104857600 原始文件的 未压缩大小 为 104,857,600 字节

可以看到在使用gzip压缩时不加参数默认删除原文件

[root@wickt tmp]# mkdir test1
[root@wickt tmp]# mv testfile ./test1
[root@wickt tmp]# gzip -k ./test1
gzip: ./test1 is a directory -- ignored

!!!gzip无法压缩文件夹

文件解压

# gunzip 解压
[root@wickt tmp]# gunzip testfile.gz
[root@wickt tmp]# ls -lh testfile
-rw-r--r--. 1 root root 100M 8月 4 18:24 testfile
[root@wickt tmp]#

# gzip -d 命令解压
[root@wickt tmp]# gzip -d -k testfile.gz
gzip: testfile already exists; do you wish to overwrite (y or n)? y
[root@wickt tmp]# ls -lh | grep testfile
-rw-r--r--. 1 root root 100M 8月 4 18:24 testfile
-rw-r--r--. 1 root root 100K 8月 4 18:24 testfile.gz

文件解压不加参数也是默认删除原文件

bzip2命令

bzip2 是 Linux/Unix 系统中一个高效的文件压缩工具,使用 Burrows-Wheeler 变换 (BWT)Huffman 编码算法,通常能提供比 gzip 更高的压缩率(尤其是文本文件),但压缩/解压速度相对较慢。压缩后的文件扩展名为 .bz2

bzip2 [选项] 文件名           # 压缩文件
bunzip2 [选项] 文件名.bz2 # 解压(等价于 bzip2 -d)
  1. 压缩与解压基础
选项 说明
无选项 压缩文件(默认删除原始文件),生成 .bz2 文件: bzip2 file.txtfile.txt.bz2
-d --decompress 解压文件(默认删除 .bz2 文件): bzip2 -d file.txt.bz2file.txt bunzip2 file.txt.bz2 效果相同
-k --keep 保留原始文件(压缩或解压后): bzip2 -k file.txt(保留 file.txtbzip2 -dk file.txt.bz2(保留 file.txt.bz2
-c --stdout 输出到标准输出(不修改文件),用于管道操作: bzip2 -c file.txt > file.txt.bz2 bzip2 -dc file.txt.bz2 > file.txt
-f --force 强制覆盖输出文件,忽略错误(如文件已存在)

  1. 压缩级别控制 (1-9)
选项 速度 压缩率 说明
-1 (或 --fast) 最快 最低 快速压缩(牺牲压缩率)
-9 (或 --best) 最慢 最高 最佳压缩(默认级别)
-# 中间值 平衡 # 为 1-9 的数字(例如 -5

注意:级别 -9 是默认值,比低级别多占用 10% 内存,但压缩率显著提升。


  1. 文件检查与测试
选项 说明
-t --test 测试压缩文件完整性(不输出数据): bzip2 -t file.txt.bz2 (成功返回 0,失败返回 1)
-v --verbose 显示操作详情(文件名、压缩率等): bzip2 -v file.txt bzip2 -tv file.txt.bz2(测试+详情)

  1. 解压专用工具
命令 等效操作 用途
bunzip2 bzip2 -d 解压 .bz2 文件
bzcat bzip2 -dc 不解压直接查看内容: `bzcat file.txt.bz2

压缩

[root@wickt tmp]# bzip2 ./test1/testfile 
[root@wickt tmp]# ls -lh ./test1/
总用量 4.0K
-rw-r--r--. 1 root root 113 8月 4 18:24 testfile.bz2
[root@wickt tmp]#

bzip2默认压缩删除原文件,使用-k参数保留原文件

同样bzip2不能压缩目录文件(文件夹)

解压

# bunzip2 命令
[root@wickt tmp]# bunzip2 ./test1/testfile.bz2
[root@wickt tmp]# ls -lh ./test1/
总用量 100M
-rw-r--r--. 1 root root 100M 8月 4 18:24 testfile

# bzip2 -d 命令
[root@wickt tmp]# bzip2 -dk ./test1/testfile.bz2
[root@wickt tmp]# ls -lh ./test1/
总用量 101M
-rw-r--r--. 1 root root 100M 8月 4 18:24 testfile
-rw-r--r--. 1 root root 113 8月 4 18:24 testfile.bz2
[root@wickt tmp]#

bzip2默认解压缩也是删除原文件

bzcat ./test1/testfile.bz2 		# 查看压缩内容

打包命令tar

tar(Tape ARchiver)是 Linux/Unix 系统中用于打包和解包文件的核心工具,可将多个文件/目录合并为单个归档文件(tarball),常与压缩工具(如 gzip, bzip2, xz)结合使用。

tar [操作模式] [选项] [归档文件] [文件/目录...]

操作模式(必须选一个)

选项 全称 说明
-c --create 创建新归档
-x --extract 解包归档文件
-t --list 列出归档内容
-r --append 向归档追加文件
-u --update 仅追加比归档内新的文件

关键选项

1. 文件指定

选项 说明
-f 指定归档文件名(必须选项) tar -cf archive.tar dir/
-v 显示操作详情(verbose 模式
-C 解压到指定目录 tar -xf file.tar -C /target

2. 压缩类型

选项 压缩工具 典型扩展名
-z gzip .tar.gz, .tgz
-j bzip2 .tar.bz2, .tbz2
-J xz .tar.xz, .txz
--zstd zstd .tar.zst

3. 权限与路径

选项 说明
-p 保留文件权限(解压时默认保留)
--same-owner 保留文件所有者(需 root 权限)
-P 允许使用绝对路径(默认移除根目录 /
--strip-components=N 解压时移除前 N 层目录

4. 过滤文件

选项 说明
--exclude="PATTERN" 排除匹配文件/目录 --exclude="*.log"
--wildcards 使用通配符匹配文件名(配合 -t 使用)

压缩效率对比

格式 压缩率 速度 典型用途
.tar - 最快 临时打包
.tar.gz 通用压缩(日志/文本)
.tar.bz2 高压缩率需求
.tar.xz 最高 最慢 长期存储/分发

压缩

[root@wickt tmp]# ls -l ./test1/
总用量 102404
-rw-r--r--. 1 root root 104857600 8月 4 18:24 testfile
-rw-r--r--. 1 root root 113 8月 4 18:24 testfile.bz2
[root@wickt tmp]# tar -cf ./test2/test1.tar ./test1
[root@wickt tmp]# ls -lh ./test2/
总用量 101M
-rw-r--r--. 1 root root 101M 8月 4 19:23 test1.tar

# -c 创建新文件, -f 指定文件名必须放最后
# 打包文件需要使用相对路径,用绝对路径会将tmp目录一起打包

gzipbzip2xz联动

# gzip
[root@wickt tmp]# tar -zcf ./test2/test1.tar.gz ./test1

# bzip2
[root@wickt tmp]# tar -cjvf ./test2/test1.tar.bz2 ./test1
./test1/
./test1/testfile.bz2
./test1/testfile

# 高压缩倍率xz
[root@wickt tmp]# tar -cJvf ./test2/test1.tar.xz ./test1
./test1/
./test1/testfile.bz2
./test1/testfile
[root@wickt tmp]# ls ./test2
test1.tar test1.tar.bz2 test1.tar.gz test1.tar.xz

解压

[root@wickt tmp]# tar -xf ./test2/test1.tar
[root@wickt tmp]# ll -h | grep test1
drwxr-xr-x. 2 root root 42 8月 4 19:10 test1

# -C 指定解压路径
[root@wickt tmp]# tar -xf ./test2/test1.tar -C ./test2
[root@wickt tmp]# ls -lh ./test2/ | grep test1
drwxr-xr-x. 2 root root 42 8月 4 19:10 test1

# 解压 .tar.gz 文件
[root@wickt tmp]# tar -zxf ./test2/test1.tar.gz -C ./ttw/
[root@wickt tmp]# ls -lh ./ttw/
总用量 0
drwxr-xr-x. 2 root root 42 8月 4 19:10 test1

# 解压 .tar.bz2 文件
[root@wickt tmp]# tar -xjvf ./test2/test1.tar.bz2 -C
[root@wickt tmp]# ls -lh ./ttn2/
总用量 0
drwxr-xr-x. 2 root root 42 8月 4 19:10 test1

#

查看

# 查看 tar 文件内容
[root@wickt tmp]# tar -tf ./test2/test1.tar
./test1/
./test1/testfile.bz2
./test1/testfile

# 查看 .tar.gz 文件
[root@wickt tmp]# tar -ztf ./test2/test1.tar.gz
./test1/
./test1/testfile.bz2
./test1/testfile

# 搜索归档内文件
[root@wickt tmp]# tar -tzvf ./test2/test1.tar.gz | grep "test"
drwxr-xr-x root/root 0 2025-08-04 19:10 ./test1/
-rw-r--r-- root/root 113 2025-08-04 18:24 ./test1/testfile.bz2
-rw-r--r-- root/root 104857600 2025-08-04 18:24 ./test1/testfile

其他用法

# 排除特定文件/目录
tar -czvf site.tar.gz --exclude="*.tmp" --exclude="cache/" /var/www/
# 使用通配符打包多个文件
tar -czvf logs.tar.gz /var/log/*.log
# 增量备份(仅打包新修改的文件)
tar -czvf incremental_backup.tar.gz --newer-mtime="2023-01-01" /data/
Author: wickt42
Link: http://example.com/2025/08/04/linux压缩与解压缩/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.