欢迎光临
我们一直在努力

从“Permission denied“到“掌控全局“:Linux 权限与进程管理之旅

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 里的权限是要剔除掉的权限。

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 速查

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

如果觉得有用,欢迎收藏,复习的时候随时翻阅! 😊

赞(0)
未经允许不得转载:171主机测评 » 从“Permission denied“到“掌控全局“:Linux 权限与进程管理之旅
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址