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

一、Linux 打包和压缩的区别

| 操作 | 作用 | 常见命令 | 结果 |
|---|---|---|---|
| 打包 | 把多个文件或目录合成一个归档文件 | tar |
.tar |
| 压缩 | 减小文件体积 | gzip、bzip2、xz、zip |
.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。
gzip 和 tar.gz 的关系
gzip 本身更适合压缩单个文件。多个文件一般先用 tar 打包,再通过 gzip 压缩,所以实际工作中更常见的是:
bash
tar -zcf logs.tar.gz /var/log
这条命令等价于"把 /var/log 打成一个归档包,并使用 gzip 压缩"。
四、zip 和 unzip 常见用法
.zip 格式在 Windows 和 Linux 之间传文件时很常见。Linux 上处理 .zip 文件主要用 zip 和 unzip。
安装说明
有些最小化安装的系统默认没有 zip 和 unzip,执行时可能会报:
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.gz 和 zip 怎么选
| 场景 | 推荐 |
|---|---|
| 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:切换用户
su 是 switch user 的缩写,用于切换用户身份。
切换到 root:
bash
su
切换到指定用户:
bash
su zhangsan
更推荐使用登录式切换:
bash
su - zhangsan
su 和 su - 的区别很关键:
| 命令 | 环境变量 | 当前目录 | 使用场景 |
|---|---|---|---|
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 修改权限
chmod 是 change 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 修改所有者和所属组
chown 是 change 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?因为普通文件默认不应该具备执行权限,否则风险太大。
当 umask 为 022 时:
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 |
十六、注意事项
tar -f后面要跟归档文件名,习惯上把f放在组合选项最后。- 解压陌生压缩包前,先用
tar -tf或unzip -l看内容,避免解错目录。 gzip默认会替换原文件,不是额外复制一份。zip和unzip不存在时,需要先安装对应软件包。root的 UID 是0,权限最高,生产环境不要长期直接用 root 做普通操作。su - 用户名会加载目标用户完整环境,比单纯su 用户名更接近真实登录。- 删除用户前先检查家目录和该用户拥有的文件,谨慎使用
userdel -r。 chmod 777不是万能解法,很多时候是安全隐患。- 目录的
w权限控制创建、删除、重命名目录项,通常需要配合x权限。 chown -R和chmod -R都要认真确认路径,递归权限改错影响很大。