
文章目录
-
- [1. 打包与压缩](#1. 打包与压缩)
-
- [1.1 独立练习目录](#1.1 独立练习目录)
- [1.2 ZIP 打包](#1.2 ZIP 打包)
- [1.3 `tar` 压缩与 gzip 压缩](#1.3
tar压缩与 gzip 压缩)
- [2. 本地与服务器之间的文件传输](#2. 本地与服务器之间的文件传输)
-
- [2.1 `sz` 与 `rz`](#2.1
sz与rz) - [2.2 `scp` 的基本用法](#2.2
scp的基本用法)
- [2.1 `sz` 与 `rz`](#2.1
- [3. 进程查看](#3. 进程查看)
-
- [3.1 `ps ajx` 查看进程快照](#3.1
ps ajx查看进程快照) - [3.2 `top` 动态查看](#3.2
top动态查看)
- [3.1 `ps ajx` 查看进程快照](#3.1
- [4. 用户身份与命令授权](#4. 用户身份与命令授权)
-
- [4.1 `su` 切换用户会话](#4.1
su切换用户会话) - [4.2 `sudo` 按授权执行命令](#4.2
sudo按授权执行命令)
- [4.1 `su` 切换用户会话](#4.1
- [5. 文件权限的表示与判断](#5. 文件权限的表示与判断)
-
- [5.1 类型、三类访问者与九位权限](#5.1 类型、三类访问者与九位权限)
- [5.2 普通文件的 `r/w/x`](#5.2 普通文件的
r/w/x) - [5.3 八进制权限](#5.3 八进制权限)
- [6. 权限与归属修改](#6. 权限与归属修改)
-
- [6.1 `chmod` 的两种常用写法](#6.1
chmod的两种常用写法) - [6.2 读取脚本与直接执行](#6.2 读取脚本与直接执行)
- [6.3 `chown` 与 `chgrp`](#6.3
chown与chgrp)
- [6.1 `chmod` 的两种常用写法](#6.1
- [7. 目录权限与操作条件](#7. 目录权限与操作条件)
-
- [7.1 文件内容与目录项](#7.1 文件内容与目录项)
- [7.2 只读名称与按名称访问](#7.2 只读名称与按名称访问)
- [7.3 文件可写与文件可删除](#7.3 文件可写与文件可删除)
- [8. 默认权限与共享目录](#8. 默认权限与共享目录)
-
- [8.1 `umask` 屏蔽创建权限](#8.1
umask屏蔽创建权限) - [8.2 粘滞位与共享目录](#8.2 粘滞位与共享目录)
- [8.1 `umask` 屏蔽创建权限](#8.1
- [9. 总结](#9. 总结)
上一篇已经介绍路径、文件整理、文本查看与管道。本篇沿用这些基础,重点放在归档传输和权限判断,就不再逐个重复基础命令了。
1. 打包与压缩
当我们需要把一个目录传给别人时,里面可能包含子目录、普通文件和隐藏文件。逐个传输既繁琐,也容易漏掉;所以,我们需要把它们组织成一个归档文件,可以保留相对位置,而压缩则进一步尝试减少占用空间。
打包解决"组织成一个文件",压缩解决"减少数据体积"。 两者常配合使用。
压缩已经压缩过的图片、视频或归档包,未必还能显著变小。
1.1 独立练习目录
本篇将在普通用户家目录下新创建linux-permission-lab目录进行相关的示例与练习。
以下命令创建两份短文本和一个隐藏文件:
bash
mkdir -p ~/linux-permission-lab/packet/docs
cd ~/linux-permission-lab
echo 'Linux permission practice' > packet/notes.txt
echo 'archive and restore' > packet/docs/readme.txt
echo 'hidden entry' > packet/.meta
后面的相对路径都将以这个练习目录为起点。
1.2 ZIP 打包
zip 常用于制作 ZIP 文件,unzip 则用于查看和解压。文件名参数在前,操作对象在后:
bash
zip -r packet.zip packet
unzip -l packet.zip
mkdir restored-zip
unzip packet.zip -d restored-zip
cat restored-zip/packet/docs/readme.txt

此时目录结构为:

这里只需要掌握三个选项:
zip -r递归处理目录;unzip -l查看文档内的条目;unzip -d指定解压目录。
打包目录时,直接传入 packet,让工具遍历其中内容。
若改成
packet/*,Shell 默认展开的*并不包括隐藏名称,容易漏掉文件;没有递归选项还可能漏掉子目录内容。
1.3 tar 压缩与 gzip 压缩
Linux 中也经常可以看到 .tar、.tar.gz 或 .tgz。可以先记住两种形式:
bash
tar -cf packet.tar packet
tar -czf packet.tar.gz packet

第一条命令只打包;第二条命令在打包时使用 gzip 压缩。
| 选项 | 当前需要掌握的作用 |
|---|---|
-c |
打包 |
-t |
列出打包内容 |
-x |
解包 |
-z |
使用 gzip 压缩或解压 |
-f |
后面跟打包文件名 |
-C |
切换到指定目录进行后续处理,这里用于指定解包位置 |
创建、查看、解包是不同操作,通常在 -c/-t/-x 中选择一种。以 tar -czf packet.tar.gz packet 为例,packet.tar.gz 是 -f 的参数,最后的 packet 才是源目录。
下面的指令先查看内容,再解开到单独目录:
bash
tar -tzf packet.tar.gz
mkdir restored-tar
tar -xzf packet.tar.gz -C restored-tar
cat restored-tar/packet/notes.txt

输出结果为 Linux permission practice。需要注意的是,restored-tar 必须事先存在;-C 并不替你创建目录。

zip 打包默认不保留 Linux 文件权限,和 tar 不一样;如果需要保留权限,优先用 tar。
如果提示命令不存在,按发行版选择安装方式即可:
bash
#Centos(已有 sudo 授权时执行)
sudo yum install zip unzip lrzsz -y # 普通用户
yum install zip unzip lrzsz -y # root用户
# Ubuntu / Debian(已有 sudo 授权时执行)
sudo apt install zip unzip lrzsz # 普通用户
apt install zip unzip lrzsz # root用户
2. 本地与服务器之间的文件传输
2.1 sz 与 rz
传输文件前需要先分清两个位置:本地电脑负责接收或提供文件,命令是在远端 Linux 中输入的。
sz/rz 通常由 lrzsz 提供,使用 ZMODEM 协议,需要客户端软件支持。
Xshell 等支持该协议的终端可以配合使用
bash
# 在远端 Linux 中执行,当前位于本文练习目录
sz packet.zip
sz 从服务器发送文件,本地客户端通常弹出接收或保存界面。反过来:
bash
# 在远端 Linux 中执行
rz
rz 在服务器端接收,本地客户端选择要上传的文件。接收结果通常放入运行 rz 时的当前目录。

2.2 scp 的基本用法
客户端不支持 ZMODEM 时,可以用 OpenSSH 的 scp。它不要求图形传输窗口,下面两条命令均在本地 Windows PowerShell执行,并替换用户名和地址。
powershell
# 下载:假设远端当前用户的家目录中有本文练习目录
scp 用户名@服务器公网IP:linux-permission-lab/packet.zip .
# 上传:本地当前目录已经有 packet.zip,远端接收目录已经存在
scp .\packet.zip 用户名@服务器公网IP:linux-permission-lab/
3. 进程查看
文件里的程序尚未运行时是静态内容;进程则是程序运行时的实例。同一程序可以运行多次,形成不同进程。
3.1 ps ajx 查看进程快照
bash
ps ajx

常见表头如下:
text
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
当前重点看:
| 字段 | 含义 |
|---|---|
PID |
进程编号,用于在当前系统中标识进程 |
PPID |
父进程编号 |
UID |
运行身份对应的用户 ID |
STAT |
状态及附加标记;如 R 表示运行或可运行,S 表示可中断睡眠 |
TIME |
累计使用的 CPU 时间(不是程序启动到现在的实际时间) |
COMMAND |
命令及参数,可能因显示宽度而截断 |
可以开两个终端观察一个容易识别的进程。在终端 A 输入:
bash
sleep 120
sleep 在指定秒数内等待,所以终端暂时不返回提示符。再在同一服务器的终端 B 输入:
bash
ps ajx | grep 'sleep 120'


通常能够找到 sleep 120,状态常见为 S。
3.2 top 动态查看
bash
top

top 会持续更新进程和资源信息,按 q 退出。常见的 %CPU、%MEM 分别反映 CPU、内存占用。
ps适合保存、筛选某一次快照,top则适合连续观察。
4. 用户身份与命令授权
对文件进行操作时会受到执行身份的影响:同一条 cat,不同用户执行可能得到不同结果。可以先查看自己是谁、属于哪些组:
bash
whoami
id

id 常显示 uid、主组 gid 和附加组 groups。用户名和组名是便于阅读的名称,系统也用数字 ID 记录身份。
4.1 su 切换用户会话
bash
su - by2099
whoami
exit
su - 用户名 是启动该用户的登录式 Shell,通常也切换到其家目录、调整环境。相比之下,su 用户名 通常保留更多当前环境,也通常不改变工作目录。
普通用户切换时常需输入目标用户的密码,具体受系统认证配置影响;root 切换到其他用户通常不要求目标密码。
su - 省略用户名时默认以 root 为目标,但一些云镜像锁定了 root 密码,不能据此保证普通用户可以用它切到 root。退出切换后的 Shell 使用 exit,返回上一层,不需要为了"切回来"反复套用 su。
4.2 sudo 按授权执行命令
bash
sudo whoami
whoami

在默认目标为 root 且当前用户获得相应授权时,第一条输出 root,第二条仍显示当前普通用户。普通形式的 sudo 命令 以指定身份运行这一条命令,不会把当前 Shell 永久变为 root。
sudo 常要求当前调用者的密码,也可能允许免密;它默认目标通常为 root,也可用 sudo -u 用户名 命令 指定其他用户,前提仍是策略允许。
临时提权是常见用途,更准确的含义是按授权以目标身份执行命令。
5. 文件权限的表示与判断
5.1 类型、三类访问者与九位权限
text
-rw-r----- 1 by2099 by2099 ... notes.txt
开头的 - 表示普通文件,不属于后面的九位权限。其后九位的权限分成三组:
text
rw- r-- ---
u g o
所有者 所属组 其他用户
u 对应文件所有者,g 对应文件所属组中的用户,o 对应前两类之外的用户。文件所属组是一个属性,不保证永远与所有者当前的主组一致。 一个用户也可以属于多个组。

普通权限判断可以按这个顺序理解:执行身份是所有者,就看 u;否则,属于文件的组就看 g;然后看 o。
例如,所有者对应 ---,其他用户对应 r--,所有者不会因为自己"也算其他人之一"而补上读权限。权限组由身份关系决定,不是挑一组最宽松的权限使用。
5.2 普通文件的 r/w/x
| 权限 | 对普通文件的含义 |
|---|---|
r,read |
读取内容,例如 cat 文件 |
w,write |
修改内容,例如向已有文件写入、清空或追加 |
x,execute |
允许把文件作为程序直接执行,仍需内容格式等条件满足 |
- |
该位置没有对应权限 |
文件可写,不意味着一定能删除;有 x,也不意味着任意文本立刻变成有效程序。
5.3 八进制权限
每组用 r=4(100)、w=2(010)、x=1(001) 的和表示。可以把它们各自看作三个独立的二进制位。
| 权限组 | 数值 | 权限组 | 数值 |
|---|---|---|---|
--- |
0 | r-- |
4 |
--x |
1 | r-x |
5 |
-w- |
2 | rw- |
6 |
-wx |
3 | rwx |
7 |
三个数字按 u/g/o 排列:640 就是 rw-r-----,644 就是 rw-r--r--,755 就是 rwxr-xr-x。
6. 权限与归属修改
6.1 chmod 的两种常用写法
回到练习目录,用单独文件观察权限的变化:
bash
cd ~/linux-permission-lab
echo 'permission example' > access.txt
chmod 640 access.txt
ls -l access.txt

此时access.txt对应的权限为为 -rw-r-----
bash
chmod u+x access.txt
chmod g+w access.txt
chmod o= access.txt
ls -l access.txt

更改后的结果为 -rwxrw----。+ 增加指定权限,- 移除指定权限,= 把指定类别设置成给定权限;例如 chmod u-x access.txt 只去掉所有者的执行位,chmod g=r access.txt 把组权限设为只读。a 表示三类全部,如 chmod a-r access.txt。
通常文件所有者可以修改其权限;其他普通用户即使具有文件写权限,也不因此自动拥有
chmod的权力。chmod更改权限时,不改变其所有者或所属组。
6.2 读取脚本与直接执行
这里使用一个只有一条输出语句的 Shell 脚本来观察执行位权限。
printf在这里把\n按换行输出;首行#!/bin/sh指明直接执行时使用的解释器。
bash
printf '#!/bin/sh\necho "permission demo"\n' > demo.sh
chmod 644 demo.sh
sh demo.sh
./demo.sh

sh demo.sh 输出 permission demo,./demo.sh 报出 Permission denied。原因是前者是执行已有的 sh 程序,让它读取脚本文本;后者要求直接执行 demo.sh,但此时脚本并没有 x可执行权限。
bash
chmod u+x demo.sh
./demo.sh

增加可执行权限x后输出 permission demo。
6.3 chown 与 chgrp
权限回答"可以做什么",归属回答"谁适用哪组权限"。改变归属可能会改变后续的权限匹配结果。
bash
sudo chown root access.txt
sudo chown root:root access.txt
chgrp root access.txt
chown 用户 文件 修改所有者,chown 用户:组 文件 同时修改所有者与所属组,chgrp 组 文件 只改所属组。
Linux 下的普通用户通常不能把文件所有权交给其他用户;修改所属组时通常要求自己是文件所有者,且属于目标组,其他情况需要管理授权。
7. 目录权限与操作条件
7.1 文件内容与目录项
| 权限 | 对目录的含义 |
|---|---|
r |
读取其中的名称列表 |
w |
修改目录项,例如创建、删除、重命名;实际操作通常还需要 x |
x |
搜索、穿过目录,访问已知名称;cd 进入目录也需要它 |
访问 a/b/file.txt 时,沿途目录通常都要允许搜索,最后还要判断对 file.txt 的具体操作权限。不是只看最末尾文件的哪一行权限就能确定结果。

目录的
x不是"允许在目录里执行任何命令",目录的r也不是"允许读取里面所有文件内容"。
7.2 只读名称与按名称访问
使用普通用户执行,不添加 sudo:
bash
mkdir gate
echo 'known content' > gate/item.txt
chmod 644 gate/item.txt
chmod 400 gate
ls -a gate
cat gate/item.txt
cd gate

此时文件所有者对 gate 只有 r。普通的 ls -a gate 可以列出名称,但是没有 x 权限 ,无法拿到文件的 inode 信息,所以无法展示文件详情。cat gate/item.txt 和 cd gate 则被拒绝。
再把目录改成只有 x:
bash
chmod 100 gate
cat gate/item.txt
ls -a gate

cat输出known content,因为已知具体名称,目录允许搜索,文件自身也可读;ls -a列表则应失败,因为目录没有r。
7.3 文件可写与文件可删除
再准备一份自己拥有的文件,把文件本身设为可读写、目录设为只读且可搜索:
bash
chmod 600 gate/item.txt
chmod 500 gate
echo 'changed content' > gate/item.txt
rm -i gate/item.txt

写入文件成功;删除时出现确认提示,输入 y 后失败,因为目录缺少 w。
这里
>打开的是一个已经存在的文件,所以可以依据文件的写权限修改内容;如果目标不存在,创建新目录项则需要目录的w+x权限。
反过来,把目录恢复为可修改,文件只留读权限:
bash
chmod 700 gate
chmod 400 gate/item.txt
rm -i gate/item.txt

确认输入 y 后,成功删除(无提示)。当前用户拥有这个普通目录,没有粘滞位等额外限制,因此能修改目录项,并不要求同时具有该文件的 w。
文件写权限控制内容修改,父目录的写与搜索权限控制常见的创建、删除和重命名。
8. 默认权限与共享目录
8.1 umask 屏蔽创建权限
新文件和目录的权限为什么常见 644、755?因为在通常情况下,程序创建对象时先提出权限请求,再由当前进程的 umask 屏蔽相应位。
普通文本文件常按 666 请求创建,即三类用户都可读写,不请求执行权限;目录常按 777 请求。666/777 是这里的常见创建请求,不是最终权限,也不是所有程序不可改变的规定。
text
最终基本权限 = 请求权限 & ~umask
umask 对应位为 1,表示屏蔽该权限;它不会添加请求中本来没有的权限。用 022 为例:
| 对象 | 常见请求 | 屏蔽 | 结果 |
|---|---|---|---|
| 普通文件 | 666 |
组与其他用户的写权限 | 644 |
| 目录 | 777 |
组与其他用户的写权限 | 755 |

8.2 粘滞位与共享目录
一个供多人写入的目录,如果只考虑目录 w + x,不同用户就可能删除彼此拥有的文件。而粘滞位为这类目录增加了删除与重命名限制。
bash
mkdir shared-demo
chmod 1777 shared-demo
ls -ld shared-demo

此时权限显示为 drwxrwxrwt。这里 1777 的前导 1 设置粘滞位,后三位仍然表示 u/g/o 的基本权限。
t占用其他用户执行位的显示位置,表示粘滞位与该执行位同时存在;粘滞位已设置而该执行位不存在时显示T。
在通常模型下,拥有必要目录权限后,带粘滞位的目录进一步限制:文件所有者、目录所有者,或具备相应管理能力的进程,才可删除或重命名其中条目。它不负责阻止读取或修改文件内容,内容访问仍由文件权限等条件决定。
在实际相关场景中,/tmp 就常常使用这种安排,适合多人临时放文件,用户只能删除 / 改名自己拥有的文件(root、目录所有者也可以删)。
⚠️ 注意:不能阻止别人读、修改文件内容,文件内容能不能改,看文件本身权限,粘滞位只管【删除、重命名】。
9. 总结
- 打包压缩:tar 侧重打包,可搭配 gzip/bzip2 压缩;zip、unzip 是独立压缩工具,适合跨平台传输。
- 文件传输:scp 基于 ssh 远程拷贝,rz/sz 适合简单上传下载,适合服务器和本地互传文件。
- 进程查看:ps 查看进程快照,top 实时监控。
- 基础权限:r 读、w 写、x 执行;目录的 x 权限是进入目录的必要条件,仅有 r 权限无法访问内部文件。
- 粘滞位:目录设置 1777 后,所有用户可写入目录,但仅文件所有者、root、目录所有者能删除、重命名文件,不限制文件内容读写。
