Linux打包压缩与用户权限管理详解

Linux 打包压缩与用户权限管理详解:targzipzip、用户、用户组和权限

一、Linux 打包和压缩的区别

操作 作用 常见命令 结果
打包 把多个文件或目录合成一个归档文件 tar .tar
压缩 减小文件体积 gzipbzip2xzzip .gz.bz2.xz.zip
打包并压缩 先归档,再压缩 tar -zcf .tar.gz

可以把打包理解成"把一堆文件装进一个箱子",压缩理解成"把箱子再挤一挤,减少占用空间"。所以 .tar.gz 通常表示:先用 tar 打成一个包,再用 gzip 压缩。

二、tar 常见用法

tar 的英文全称是 tape archive,现在主要用于文件归档和压缩。Linux 服务器上备份目录、迁移配置、打包日志,基本都离不开它。

常用选项

选项 说明
-c 创建归档文件
-x 解包或解压
-t 查看归档文件内容
-f 指定归档文件名,后面通常紧跟文件名
-z 使用 gzip 压缩或解压,常见后缀为 .tar.gz
-j 使用 bzip2 压缩或解压,常见后缀为 .tar.bz2
-J 使用 xz 压缩或解压,常见后缀为 .tar.xz
-v 显示处理过程
-C 解压到指定目录

这里最常用的组合是:

bash 复制代码
tar -zcf xxx.tar.gz file1 file2 dir1
tar -tf xxx.tar.gz
tar -xf xxx.tar.gz
tar -xf xxx.tar.gz -C /target/path

命令示例:打包并压缩文件

先准备几个测试文件:

bash 复制代码
touch a.txt b.txt c.txt

把这三个文件打成 abc.tar.gz

bash 复制代码
tar -zcf abc.tar.gz a.txt b.txt c.txt

如果想看到处理过程,可以加 -v

bash 复制代码
tar -zcvf abc.tar.gz a.txt b.txt c.txt

示例输出:

text 复制代码
a.txt
b.txt
c.txt

常见写法里,-zcvf 的含义可以拆开看:

text 复制代码
z:使用 gzip
c:创建包
v:显示过程
f:指定文件名

注意:-f 后面一般要紧跟归档文件名,所以习惯上把 f 放在组合选项最后,例如 tar -zcvf abc.tar.gz ...

命令示例:查看压缩包内容

不解压,只想看包里有什么:

bash 复制代码
tar -tf abc.tar.gz

如果想看更详细的权限、属主、大小和时间:

bash 复制代码
tar -tvf abc.tar.gz

示例输出:

text 复制代码
-rw-r--r-- root/root         0 2025-06-17 18:31 a.txt
-rw-r--r-- root/root         0 2025-06-17 18:23 b.txt
-rw-r--r-- root/root         0 2025-06-17 18:23 c.txt

这个命令在生产环境很实用。比如拿到一个备份包后,先 tar -tf 看一下里面的目录结构,确认没问题再解压,避免把文件解到一堆奇怪的位置。

命令示例:解压到当前目录

bash 复制代码
tar -xf abc.tar.gz

-v 显示过程:

bash 复制代码
tar -xvf abc.tar.gz

如果压缩包是 .tar.gz,有些人会写:

bash 复制代码
tar -zxvf abc.tar.gz

现在很多 tar 可以根据文件格式自动识别压缩方式,所以 tar -xf abc.tar.gz 也能正常解压。不过在写脚本或给别人交付命令时,写完整一些更清楚。

命令示例:解压到指定目录

abc.tar.gz 解压到 /atguigu/

bash 复制代码
tar -zxvf abc.tar.gz -C /atguigu/

-C 后面的目录必须提前存在,否则会报错:

text 复制代码
tar: /atguigu: Cannot open: No such file or directory

可以先创建目录:

bash 复制代码
mkdir -p /atguigu
tar -zxvf abc.tar.gz -C /atguigu/

易错点:绝对路径打包的提示

如果打包时使用绝对路径,例如:

bash 复制代码
tar -zcvf etc-backup.tar.gz /etc/hosts

可能会看到类似提示:

text 复制代码
tar: Removing leading `/' from member names

这个不是严重错误。tar 默认会去掉成员名前面的 /,避免解压时直接覆盖系统绝对路径下的文件。对于备份来说,这是一种保护。

三、gzip 常见用法

gzip 用于压缩单个文件,压缩后默认生成 .gz 文件。

命令示例:压缩文件

bash 复制代码
touch a.txt
gzip a.txt

执行后,原来的 a.txt 会变成:

text 复制代码
a.txt.gz

这里要注意:gzip 默认会把原文件替换成压缩后的 .gz 文件,而不是像 tar -zcf 那样保留原文件再额外生成一个包。

命令示例:解压 .gz 文件

bash 复制代码
gzip -d a.txt.gz

也可以使用:

bash 复制代码
gunzip a.txt.gz

这两个命令效果类似,都会把 a.txt.gz 解压回 a.txt

gziptar.gz 的关系

gzip 本身更适合压缩单个文件。多个文件一般先用 tar 打包,再通过 gzip 压缩,所以实际工作中更常见的是:

bash 复制代码
tar -zcf logs.tar.gz /var/log

这条命令等价于"把 /var/log 打成一个归档包,并使用 gzip 压缩"。

四、zipunzip 常见用法

.zip 格式在 Windows 和 Linux 之间传文件时很常见。Linux 上处理 .zip 文件主要用 zipunzip

安装说明

有些最小化安装的系统默认没有 zipunzip,执行时可能会报:

text 复制代码
-bash: zip: command not found

原因很简单:系统没有安装对应软件包。CentOS/RHEL 系可以执行:

bash 复制代码
yum install -y zip unzip

如果是 Ubuntu/Debian 系,可以使用:

bash 复制代码
apt install -y zip unzip

命令示例:创建 zip 压缩包

bash 复制代码
touch a.txt b.txt c.txt
zip abc.zip a.txt b.txt c.txt

示例输出:

text 复制代码
  adding: a.txt (stored 0%)
  adding: b.txt (stored 0%)
  adding: c.txt (stored 0%)

如果要压缩目录,通常加 -r

bash 复制代码
zip -r logs.zip /var/log

命令示例:解压 zip 压缩包

bash 复制代码
unzip abc.zip

解压到指定目录:

bash 复制代码
unzip abc.zip -d /tmp/abc

查看压缩包内容但不解压:

bash 复制代码
unzip -l abc.zip

tar.gzzip 怎么选

场景 推荐
Linux 服务器之间传输 tar.gz
备份 Linux 目录权限和属主信息 tar.gz
Windows 和 Linux 之间互传 zip
给非 Linux 用户发送压缩包 zip

如果是运维场景,tar.gz 更常用;如果需要兼容 Windows,.zip 更省事。

五、Linux 用户、UID 和 GID

Linux 是多用户系统。系统并不是靠"用户名字符串"来判断权限的,底层真正识别用户的是数字 ID。

名称 说明
UID User ID,用户 ID
GID Group ID,用户组 ID
用户名 给人看的名字,例如 zhangsan
组名 给人看的组名,例如 devops

可以这样理解:用户名像身份证上的姓名,UID 像身份证号码。人更容易记住姓名,系统更适合处理数字。

UID 常见范围

类型 常见范围 说明
超级用户 0 root 用户,权限最高
系统用户 1-999 常用于运行系统服务,不一定允许登录
普通用户 1000 及以上 普通登录用户

不同发行版范围可能略有区别,例如 CentOS 7 常见系统用户范围是 1-999,Ubuntu 上也有自己的规则。实际判断时以系统配置为准。

GID 常见范围

类型 常见范围 说明
root 组 0 root 所属组
系统组 1-999 系统服务相关组
普通组 1000 及以上 普通用户组

六、用户相关配置文件

用户管理命令最终会改动系统中的用户配置文件。平时不建议直接手改,除非明确知道自己在做什么,但理解这些文件很有必要。

/etc/passwd

/etc/passwd 存储用户基础信息。

查看某个用户:

bash 复制代码
grep '^root:' /etc/passwd

示例格式:

text 复制代码
root:x:0:0:root:/root:/bin/bash

字段用冒号分隔:

序号 字段 示例 说明
1 用户名 root 登录名
2 密码占位符 x 密码实际保存在 /etc/shadow
3 UID 0 用户 ID
4 GID 0 主组 ID
5 描述信息 root 用户说明
6 家目录 /root 登录后的默认目录
7 登录 Shell /bin/bash 用户登录后使用的 Shell

/etc/group

/etc/group 存储用户组信息。

bash 复制代码
grep '^root:' /etc/group

示例格式:

text 复制代码
root:x:0:

字段说明:

序号 字段 说明
1 组名 例如 root
2 组密码占位符 很少直接使用
3 GID 组 ID
4 附加组成员 多个用户用逗号分隔

/etc/shadow

/etc/shadow 存储用户密码相关信息,权限更严格。

bash 复制代码
ls -l /etc/shadow

普通用户一般没有权限直接读取这个文件。passwd 命令修改密码时,背后就会更新 /etc/shadow

七、用户管理命令

useradd:创建用户

useradd 用于创建新用户。

常用选项:

选项 说明
-u 指定 UID
-g 指定主组
-s 指定登录 Shell
-M 不创建家目录

创建普通用户:

bash 复制代码
useradd zhangsan

创建用户并指定 UID:

bash 复制代码
useradd -u 1111 zhangsan

创建不允许登录、不创建家目录的用户:

bash 复制代码
useradd -u 1111 -s /sbin/nologin -M zhangsan

这种写法常用于服务账号。比如某个程序只需要一个运行身份,不需要真正登录系统,就可以把 Shell 设置为 /sbin/nologin

创建后可以检查:

bash 复制代码
id zhangsan
grep '^zhangsan:' /etc/passwd /etc/group /etc/shadow

passwd:设置或修改密码

给用户设置密码:

bash 复制代码
passwd zhangsan

执行后根据提示输入新密码。

在部分 CentOS/RHEL 系统中,可以使用 --stdin 非交互设置密码:

bash 复制代码
echo '123456' | passwd --stdin zhangsan

注意:这种方式会把明文密码出现在命令历史或脚本里,生产环境不建议这样写。更安全的做法是使用交互式输入、密钥登录或统一账号管理平台。

su:切换用户

suswitch user 的缩写,用于切换用户身份。

切换到 root:

bash 复制代码
su

切换到指定用户:

bash 复制代码
su zhangsan

更推荐使用登录式切换:

bash 复制代码
su - zhangsan

susu - 的区别很关键:

命令 环境变量 当前目录 使用场景
su zhangsan 部分保留原用户环境 通常不切换目录 临时切身份
su - zhangsan 加载目标用户完整登录环境 切到目标用户家目录 模拟正常登录

排查环境变量、PATH、家目录相关问题时,优先用 su - 用户名

userdel:删除用户

删除用户:

bash 复制代码
userdel zhangsan

默认情况下,userdel 不一定会删除用户家目录。连家目录一起删除:

bash 复制代码
userdel -r zhangsan

这里要谨慎。原因是家目录里可能有业务文件、脚本、日志或 SSH 密钥,一旦 -r 删除,恢复成本很高。生产环境删除用户前,建议先确认:

bash 复制代码
id zhangsan
ls -la /home/zhangsan
find / -user zhangsan -ls

确认没有残留重要文件,再决定是否删除。

usermod:修改用户信息

usermod 用于修改已有用户。

常用选项:

选项 说明
-s 修改登录 Shell
-u 修改 UID
-g 修改主组
-G 修改附加组
-aG 追加附加组,常用

修改登录 Shell:

bash 复制代码
usermod -s /bin/bash zhangsan

修改 UID:

bash 复制代码
usermod -u 2222 zhangsan

修改主组:

bash 复制代码
usermod -g devops zhangsan

把用户追加到附加组:

bash 复制代码
usermod -aG docker zhangsan

这里最容易写错的是 -G。如果只写 -G docker,可能会覆盖原来的附加组;如果是追加,一般写 -aG

查询用户信息

常用命令:

命令 说明
id 用户名 查看用户 UID、GID 和组信息
whoami 查看当前用户
w 查看当前登录用户和正在执行的命令
last 查看登录历史
lastlog 查看所有用户最近一次登录时间

示例:

bash 复制代码
id zhangsan
whoami
w
last
lastlog

如果用户不存在,id 会提示:

text 复制代码
id: zhangsan: no such user

八、常见问题:命令行变成 -bash-4.2$

有时切换到某个用户后,命令提示符不是正常的:

text 复制代码
[zhangsan@localhost ~]$

而是变成:

text 复制代码
-bash-4.2$

常见原因是用户家目录里的 Bash 初始化文件丢失,比如:

text 复制代码
.bash_profile
.bashrc
.bash_logout

新建用户时,系统通常会从 /etc/skel/ 复制这些模板文件到用户家目录。如果这些文件被误删,可以手动补回:

bash 复制代码
cp /etc/skel/.bash* /home/zhangsan/
chown zhangsan:zhangsan /home/zhangsan/.bash*

然后重新登录或重新 su - zhangsan

九、用户组管理:groupadd

Linux 权限不只按用户控制,也按组控制。一个用户可以有一个主组,也可以加入多个附加组。

创建用户组:

bash 复制代码
groupadd devops

指定 GID:

bash 复制代码
groupadd -g 1234 devops

创建用户时指定主组:

bash 复制代码
useradd -g devops lisi

修改用户主组:

bash 复制代码
usermod -g devops zhangsan

查看效果:

bash 复制代码
id zhangsan

输出类似:

text 复制代码
uid=1111(zhangsan) gid=1234(devops) groups=1234(devops)

十、权限管理基础

Linux 中每个文件或目录都有权限信息。使用 ls -l 可以查看:

bash 复制代码
ls -l test.txt

示例:

text 复制代码
-rw-r--r-- 1 root root 0 Jun 20 15:19 test.txt

第一列 -rw-r--r-- 可以拆成四部分:

text 复制代码
- rw- r-- r--
│  │   │   └── 其他用户权限
│  │   └────── 所属组权限
│  └────────── 所有者权限
└───────────── 文件类型

文件类型常见字符:

字符 说明
- 普通文件
d 目录
l 软链接

权限字符:

字符 英文 含义
r read
w write
x execute 执行
- none 没有该权限

十一、chmod 修改权限

chmodchange mode 的缩写,用于修改文件或目录权限。

符号模式

格式:

bash 复制代码
chmod [ugoa][+-=][rwx] 文件

符号含义:

符号 说明
u 所有者
g 所属组
o 其他用户
a 所有人
+ 增加权限
- 删除权限
= 设置为指定权限

示例:

bash 复制代码
chmod u+x test.sh
chmod g+w test.txt
chmod o-r test.txt
chmod u=rwx,g=rx,o=r test.txt
chmod a+x test.sh

数字模式

数字权限更常用:

权限 数字
r 4
w 2
x 1

每组权限把数字相加:

权限 计算 数字
rwx 4+2+1 7
rw- 4+2 6
r-x 4+1 5
r-- 4 4
--- 0 0

常见权限:

bash 复制代码
chmod 755 script.sh
chmod 644 config.conf
chmod 700 private_dir
chmod 600 id_rsa

对应含义:

权限 含义 常见场景
755 所有者可读写执行,其他人可读可执行 脚本、目录
644 所有者可读写,其他人只读 普通配置文件
700 只有所有者可读写执行 私有目录
600 只有所有者可读写 私钥文件

易错点:不要随手 chmod 777

chmod 777 表示所有人都可以读、写、执行:

bash 复制代码
chmod 777 test.txt

这在测试环境里图省事很常见,但生产环境要慎用。因为这等于把文件的修改权交给了所有用户。遇到权限问题时,应该先判断缺的是读、写还是执行,再精确授权。

例如脚本无法执行,通常只需要:

bash 复制代码
chmod +x script.sh

不需要直接给 777

十二、chown 修改所有者和所属组

chownchange owner 的缩写,用于修改文件的所有者或所属组。

格式:

bash 复制代码
chown 用户 文件
chown 用户:组 文件
chown :组 文件

示例:

bash 复制代码
chown zhangsan test.txt
chown zhangsan:devops test.txt
chown :devops test.txt

递归修改目录:

bash 复制代码
chown -R zhangsan:devops /data/project

-R 会递归修改目录下所有文件和子目录,生产环境执行前一定要确认路径。尤其是下面这种命令,风险很高:

bash 复制代码
chown -R user:group /

这会从根目录开始改属主,基本属于事故级操作。

十三、权限作用在文件和目录上有什么区别

rwx 对文件和目录的含义不完全一样,这块是权限学习里最容易混的地方。

权限 对普通文件的作用 对目录的作用
r 读取文件内容 查看目录里的文件名
w 修改文件内容 在目录中创建、删除、重命名文件
x 执行脚本或程序 进入目录,访问目录内文件属性

文件权限示例

准备脚本:

bash 复制代码
echo 'whoami' > test.sh

只有读权限:

bash 复制代码
chmod 400 test.sh
cat test.sh
./test.sh

能读,但不能执行。

只有执行权限:

bash 复制代码
chmod 100 test.sh
./test.sh

很多脚本只有 x 也执行不了,因为解释器还需要读取脚本内容。实际给脚本执行权限时,常见是:

bash 复制代码
chmod 755 test.sh

或者至少:

bash 复制代码
chmod 500 test.sh

目录权限示例

目录的 x 权限特别重要。没有 x,很多操作会变得很奇怪。

只有读权限:

bash 复制代码
chmod 400 /data/testdir
ls /data/testdir
cd /data/testdir

可能能看到文件名,但无法进入目录,也无法查看完整文件属性。

有读和执行权限:

bash 复制代码
chmod 500 /data/testdir
ls -l /data/testdir
cd /data/testdir

可以查看和进入,但不能创建、删除、重命名。

有写但没有执行权限:

bash 复制代码
chmod 200 /data/testdir
touch /data/testdir/a.txt

通常也无法正常创建文件。因为目录的写权限需要配合执行权限,系统才能定位目录里的具体目录项。

所以目录常见权限一般是:

bash 复制代码
chmod 755 /data/public
chmod 700 /data/private
chmod 775 /data/team

十四、系统默认权限:umask

新建文件和目录时,系统会根据 umask 计算默认权限。

查看当前 umask

bash 复制代码
umask

常见输出:

text 复制代码
0022

Linux 中默认权限的基础值通常是:

类型 基础权限
文件 666
目录 777

为什么文件不是 777?因为普通文件默认不应该具备执行权限,否则风险太大。

umask022 时:

text 复制代码
目录:777 - 022 = 755
文件:666 - 022 = 644

所以新建目录通常是:

text 复制代码
drwxr-xr-x

新建文件通常是:

text 复制代码
-rw-r--r--

临时修改 umask

bash 复制代码
umask 027

之后新建目录默认可能变成 750,新建文件默认可能变成 640。这在多用户服务器上很有用,可以减少其他用户默认可读的范围。

十五、常用命令速查

打包压缩

需求 命令
创建 .tar.gz tar -zcf app.tar.gz app/
显示打包过程 tar -zcvf app.tar.gz app/
查看包内容 tar -tf app.tar.gz
解压到当前目录 tar -xf app.tar.gz
解压到指定目录 tar -xf app.tar.gz -C /opt/
压缩单个文件 gzip access.log
解压 .gz gzip -d access.log.gz
创建 .zip zip -r app.zip app/
解压 .zip unzip app.zip

用户和用户组

需求 命令
创建用户 useradd zhangsan
设置密码 passwd zhangsan
切换用户 su - zhangsan
删除用户及家目录 userdel -r zhangsan
修改 Shell usermod -s /bin/bash zhangsan
创建组 groupadd devops
修改用户主组 usermod -g devops zhangsan
追加附加组 usermod -aG docker zhangsan
查看用户信息 id zhangsan

权限管理

需求 命令
给脚本执行权限 chmod +x script.sh
设置普通文件权限 chmod 644 file.conf
设置脚本或目录权限 chmod 755 script.sh
设置私有文件权限 chmod 600 id_rsa
修改所有者 chown zhangsan file.txt
修改所有者和组 chown zhangsan:devops file.txt
递归修改属主属组 chown -R zhangsan:devops /data/project
查看默认权限掩码 umask

十六、注意事项

  1. tar -f 后面要跟归档文件名,习惯上把 f 放在组合选项最后。
  2. 解压陌生压缩包前,先用 tar -tfunzip -l 看内容,避免解错目录。
  3. gzip 默认会替换原文件,不是额外复制一份。
  4. zipunzip 不存在时,需要先安装对应软件包。
  5. root 的 UID 是 0,权限最高,生产环境不要长期直接用 root 做普通操作。
  6. su - 用户名 会加载目标用户完整环境,比单纯 su 用户名 更接近真实登录。
  7. 删除用户前先检查家目录和该用户拥有的文件,谨慎使用 userdel -r
  8. chmod 777 不是万能解法,很多时候是安全隐患。
  9. 目录的 w 权限控制创建、删除、重命名目录项,通常需要配合 x 权限。
  10. chown -Rchmod -R 都要认真确认路径,递归权限改错影响很大。
相关推荐
ls_elect1 小时前
PostgreSQL 18.4 SCRAM-SHA-256 认证故障诊断及修复办法
linux·数据库·postgresql
熊文豪1 小时前
给国产数据库装上中文搜索引擎:zhparser vs jieba 分词实战,与三个隐藏关卡
数据库·搜索引擎·电科金仓
狂师2 小时前
测试人员必备:推荐一款智能测试数据清理AI Skill,支持db、redis、mq等
数据库·aigc·测试
疯狂打码的少年2 小时前
【软件工程】需求工程:需求获取与需求分析
数据库·笔记·软件工程·需求分析
Database_Cool_2 小时前
阿里云 PolarDB-X vs TiDB 分布式数据库选型指南
数据库·分布式·阿里云·tidb
数据库小学妹2 小时前
分布式数据库架构怎么选?三种路线对比+迁移避坑指南
数据库·分布式·分布式数据库·数据库架构·数据迁移·数据库选型
陈同学xxx2 小时前
Hermes Agent 接入飞书,在手机上随时聊天
linux·python·飞书
桑榆肖物2 小时前
在 .NET MAUI 里接入 PP-OCRv6 文本检测实现查找并点击
数据库·redis·.net·maui
网络小白不怕黑2 小时前
14.VSFTP服务相关配置
linux·运维·服务器