Linux 文件权限与进程管理:从入门到实战
为什么你创建的文件别人能改?为什么程序关掉终端就停了?今天这篇博客,我们把 Linux 的文件权限和进程管理一次讲透。内容较多,建议收藏后慢慢看。
第一部分:文件权限管理
一、umask:控制新建文件的默认权限
每次你新建文件或目录,系统都会给它们一个"默认权限"。这个默认权限由 umask 决定。
核心公式:
新建文件权限 = 666 – umask
新建目录权限 = 777 – umask
# 查看当前 umask
umask
# 0022
# 新建文件/目录,看看默认权限
touch f1; mkdir d1
ls -l
# drwxr-xr-x. 2 laoma laoma 6 Nov 8 17:05 d1 → 755
# -rw-r–r–. 1 laoma laoma 0 Nov 8 17:05 f1 → 644
umask 的含义:umask 里的权限是要剔除掉的权限。
| 022 | 644(rw-r–r–) | 755(rwxr-xr-x) | 默认,其他人只能读 |
| 000 | 666(rw-rw-rw-) | 777(rwxrwxrwx) | 所有人都能读写 |
| 077 | 600(rw——-) | 700(rwx——) | 只有自己能用 |
# 设置 umask 为 0,看效果
umask 0
touch f2; mkdir d2
ls -ld *2
# drwxrwxrwx. 2 laoma laoma 6 Nov 8 17:07 d2 → 777
# -rw-rw-rw-. 1 laoma laoma 0 Nov 8 17:07 f2 → 666
# 设置 umask 为 077,看效果
umask 077
touch f3; mkdir d3
ls -ld *3
# drwx——. 2 laoma laoma 6 Nov 8 17:10 d3 → 700
# -rw——-. 1 laoma laoma 0 Nov 8 17:10 f3 → 600
持久化 umask:
# 只对当前用户生效
echo 'umask 077' >> ~/.bashrc
source ~/.bashrc
# 对所有用户生效(需 root)
echo 'umask 077' >> /etc/bashrc
一句话:umask 是"拿走"哪些权限,值越大,权限越小。
二、特殊权限:SUID、SGID、Sticky
除了普通的 rwx,Linux 还有三种特殊权限,用来解决"权限不够"或"权限太乱"的问题。
| SUID | 4 | 文件 | 以文件所有者身份运行 |
| SGID | 2 | 目录 | 新建文件继承目录的组 |
| Sticky | 1 | 目录 | 只有文件所有者能删除 |
1. SUID:让普通用户"临时变身"root
经典案例:普通用户为什么能修改 /etc/shadow(只有 root 可读写)?
# shadow 文件权限:只有 root 可读写
ls -l /etc/shadow
# ———-. 1 root root 1264 Nov 8 16:38 /etc/shadow
# 但普通用户能改密码!
passwd
# Changing password for user laoma.
# passwd: all authentication tokens updated successfully.
# 原因:passwd 程序有 SUID
ls -l $(which passwd)
# -rwsr-xr-x. 1 root root 27856 Apr 1 2020 /usr/bin/passwd
# ↑
# s = SUID
危险示例:给 vim 加 SUID,普通用户就能改任何文件
# root 给 vim 设置 SUID
chmod u+s /usr/bin/vim
ls -l /usr/bin/vim
# -rwsr-xr-x. 1 root root … /usr/bin/vim
# 普通用户现在可以修改任何文件!
[laoma@centos7 ~]$ vim /etc/passwd # 以 root 身份编辑
⚠️ 安全原则:永远不要给 vim、bash、cat 等通用工具设置 SUID!
2. SGID:让团队协作更简单
场景:dev1 和 dev2 都属于 devops 组,想一起编辑共享目录里的文件。
# 准备用户和组
groupadd devops
useradd -G devops dev1
useradd -G devops dev2
# 创建共享目录
mkdir webapp
chgrp devops webapp
chmod g=rwx webapp
实验一:没有 SGID 的问题
su -l dev1
touch webapp/dev-f1
ll webapp/dev-f1
# -rw-rw-r–. 1 dev1 dev1 0 … dev-f1
# ↑
# 组是 dev1,不是 devops!
dev2 属于 devops 组,但文件的组是 dev1,所以 dev2 无法编辑。
实验二:设置 SGID 后解决问题
# 给目录设置 SGID
chmod g+s webapp
# dev1 再创建文件
su -l dev1
touch webapp/dev-f2
ll webapp/dev-f2
# -rw-rw-r–. 1 dev1 devops 0 … dev-f2
# ↑
# 组是 devops(继承目录的组)
# dev2 现在可以编辑了
su -l dev2
echo hello world >> webapp/dev-f2 # 成功
SGID 口诀:目录设 SGID,新建文件继承组。
3. Sticky Bit:保护 /tmp 目录
场景:/tmp 目录所有人都能写,但如果谁都能删别人的文件,就乱套了。
# /tmp 目录权限
ls -ld /tmp
# drwxrwxrwt. 20 root root 4096 Nov 8 16:50 /tmp
# ↑
# t = Sticky Bit
# 普通用户尝试删除别人的文件
[laoma@centos7 ~]$ rm /tmp/storage.log
rm: cannot remove '/tmp/storage.log': Operation not permitted
# 删除自己的文件没问题
[laoma@centos7 ~]$ touch /tmp/laoma-f1
[laoma@centos7 ~]$ rm /tmp/laoma-f1 # 成功
Sticky 口诀:目录设 Sticky,只有主人能删除。
4. 查找系统中的特殊权限文件
# 查找所有 SUID 文件
find / -perm -4000 -type f 2>/dev/null
# 查找所有 SGID 文件
find / -perm -2000 2>/dev/null
# 查找所有 Sticky 目录
find / -perm -1000 -type d 2>/dev/null
三、chattr:连 root 都改不了的文件
想创建一个连 root 都无法删除的文件?用 chattr 设置扩展属性。
# 查看支持的属性
chattr –help
# 两个最常用属性:
# +a append only 只能追加内容
# +i immutable 完全不可修改
append only(只能追加):
touch /opt/operator.log
chattr +a /opt/operator.log
# 尝试覆盖写入 → 失败
echo hello world > /opt/operator.log
# -bash: /opt/operator.log: 不允许的操作
# 追加写入 → 成功
echo hello world 1 >> /opt/operator.log #
echo hello world 2 >> /opt/operator.log #
# 删除 → 失败
rm -f /opt/operator.log
# rm: 无法删除'/opt/operator.log': 不允许的操作
immutable(完全不可变):
cp /etc/passwd ./passwd
chattr +i passwd
# 追加 → 失败
echo 'lw:x:1000:1000:lw:/home/lw:/bin/bash' >> passwd
# -bash: passwd: 不允许的操作
# 删除 → 失败
rm -f passwd
# rm: 无法删除'passwd': 不允许的操作
# 取消属性后才能修改
chattr -i passwd
echo 'lw:x:1000:1000:lw:/home/lw:/bin/bash' >> passwd #
💡 实战场景:重要配置文件改完后,加上 +i 属性防止误删误改。
第二部分:进程管理
一、什么是进程?
| 程序 | 静态的可执行文件 |
| 进程 | 运行中的程序,需要 CPU、内存等资源 |
| 线程 | 比进程更小的执行单元 |
进程的组成:
- 内存地址空间
- 安全属性(所有者、权限)
- 程序代码
- 进程状态
二、进程是怎么产生的?fork!
当你执行一个命令时,Shell 会通过 fork 创建一个子进程来运行它。
# 在 bash 中执行 sleep
sleep 5
# 此时 sleep 就是 bash 的子进程
三、ps:查看进程信息
ps 是最常用的进程查看命令,支持三种选项风格:
| UNIX | 单个 – | ps -ef |
| GNU | 两个 — | ps –sort |
| BSD | 不加 – | ps aux |
常用组合:
# 查看所有进程
ps -e
# 查看所有进程(含详细信息)
ps -ef
# 查看所有进程(BSD 风格)
ps aux
# 查看指定用户的进程
ps -u laoma u
# 查看指定终端的进程
ps -t pts/1 u
# 查看进程树
ps axf
# 查看指定进程的特定属性
ps -o pid,%cpu,%mem,command 1159
# 按 CPU 降序排序
ps aux –sort -%cpu
# 按内存降序排序
ps aux –sort -%mem
输出字段解析:
| PID | 进程 ID |
| PPID | 父进程 ID |
| USER/UID | 进程所有者 |
| %CPU | CPU 占用百分比 |
| %MEM | 内存占用百分比 |
| VSZ | 虚拟内存大小 |
| RSS | 实际物理内存 |
| STAT | 进程状态 |
| TTY | 所在终端(? 表示后台) |
| TIME | 累计 CPU 时间 |
四、前台进程与后台进程
| 前台进程 | 占用终端,能接收键盘输入 |
| 后台进程 | 不占用终端,不能接收键盘输入 |
# 后台运行(命令后加 &)
study Linux &
# [1] 67307
# [1] 是 job 号,67307 是 PID
# 查看当前 shell 的作业
jobs
# [1]+ 运行中 study Linux &
# 前台运行的进程按 Ctrl+Z 暂停
study Python
# ^Z
# [2]+ 已停止 study Python
# 把暂停的作业放到后台运行
bg %2
# 把后台作业调到前台
fg %1
# 终止前台进程
# 按 Ctrl+C
后台进程的特殊规则:
- 需要交互的命令(如 passwd)无法在后台运行
- 后台进程尝试读取终端输入时会自动暂停
# passwd 需要输入,放后台会自动暂停
passwd &
# [3] 3135
# [1]+ 已停止 passwd
五、防止断网导致进程终止
问题:SSH 远程执行长任务(如打补丁 2 小时),断网后任务会终止。
方法一:nohup
# nohup 让进程忽略挂起信号
nohup study English &
# 输出会保存到 nohup.out
方法二:screen
# 安装 screen
yum install -y screen
# 创建一个 screen 会话
screen
sleep 1234
# 按 Ctrl+A 然后按 D 分离会话(或直接关掉终端)
# 查看 screen 列表
screen -ls
# There is a screen on:
# 40398.pts-7.centos7 (Detached)
# 重新连接
screen -r 40398.pts-7.centos7
# 关闭 screen 会话
exit # 在会话内执行
screen -X -S 40398 quit # 在会话外执行
kill 40398 # 用 PID 关闭
每个用户只能看到自己的 screen 会话,root 也看不到其他用户的。
快速参考
特殊权限速查
| SUID | 4 | u+s | 以文件所有者身份运行 |
| SGID | 2 | g+s | 目录新建文件继承组 |
| Sticky | 1 | o+t | 只有所有者能删除 |
umask 速查
| 022 | 644 | 755 |
| 002 | 664 | 775 |
| 077 | 600 | 700 |
| 000 | 666 | 777 |
进程查看速查
| ps -ef | 查看所有进程 |
| ps aux | 查看所有进程(BSD 风格) |
| ps axf | 查看进程树 |
| ps -u 用户 u | 查看指定用户进程 |
| ps aux –sort -%cpu | 按 CPU 排序 |
作业控制速查
| 后台运行 | 命令 & |
| 查看作业 | jobs |
| 暂停前台 | Ctrl+Z |
| 后台继续 | bg %N |
| 调回前台 | fg %N |
| 终止前台 | Ctrl+C |
| 防断网运行 | nohup 命令 & |
| 会话保持 | screen |
如果觉得有用,欢迎收藏,复习的时候随时翻阅! 😊





