飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 基础入门

    • Linux 命令概述与环境准备
    • 文件与目录操作(上):ls、cd、pwd
    • 文件与目录操作(下):cat、touch、mkdir、rm、cp、mv
    • 获取帮助与基础工具:man、help、clear、exit、sudo
  • 文件权限

    • 文件权限管理:chmod、chown
  • 系统与监控

    • 进程管理与系统监控:ps、top、kill、df、du、free
    • 用户与环境:whoami、id、env、echo、history
  • 网络命令

    • 网络诊断(上):ping、curl、wget
    • 网络诊断(下):netstat、ss、ip
    • 网络抓包与高级工具:traceroute、tcpdump、nc
    • DNS 与防火墙:nslookup、dig、iptables
  • 文本处理

    • 文本搜索:grep
    • 文本处理(上):awk
    • 文本处理(下):sed
    • 文本排序与统计:sort、uniq、wc
    • 文件查看与查找:head、tail、cut、find
    • 归档压缩与管道组合:tar、gzip、xargs
  • 开发工具

    • 开发工具链(上):gcc、make
    • 开发工具链(下):gdb、time
    • 版本控制:git
    • 远程操作:ssh、scp
    • 编辑器:vim、nano
  • Shell 编程

    • Shell 编程基础(上):变量、管道、重定向
    • Shell 编程基础(下):条件、循环、函数
  • 综合实战

    • 综合实战:日志分析

文件权限管理:chmod、chown

Linux 权限模型

Linux 中每个文件都有三种权限,对应三类用户:

三种权限

权限符号数字对文件的作用对目录的作用
读(Read)r4查看文件内容列出目录内容(ls)
写(Write)w2修改文件内容创建/删除目录内文件
执行(Execute)x1执行程序/脚本进入目录(cd)

三类用户

用户类型含义
所有者(Owner/User)创建文件的用户
所属组(Group)文件所属的组
其他人(Others)系统中其他所有用户

chmod:修改权限

chmod(Change Mode)修改文件或目录的权限。

数字表示法(最常用)

# 权限数字 = 所有者 + 组 + 其他人
# 7 = 4+2+1 = rwx
# 6 = 4+2 = rw-
# 5 = 4+1 = r-x
# 4 = 4 = r--
# 0 = 0 = ---

chmod 755 script.sh     # rwxr-xr-x(所有者可读写执行,其他人可读执行)
chmod 644 file.txt      # rw-r--r--(所有者可读写,其他人只读)
chmod 700 private.key   # rwx------(只有所有者能访问)
chmod 777 shared/       # rwxrwxrwx(所有人完全权限,慎用)

符号表示法

# 给所有者添加执行权限
chmod u+x script.sh

# 给组添加写权限
chmod g+w file.txt

# 移除其他人的读权限
chmod o-r file.txt

# 给所有人添加执行权限
chmod a+x script.sh

# 设置权限为 rwxr-xr-x
chmod u=rwx,g=rx,o=rx script.sh

常用权限组合

数字权限适用场景
777rwxrwxrwx共享目录(慎用)
755rwxr-xr-x可执行脚本、程序
644rw-r--r--普通文件、配置文件
700rwx------私钥、密码文件
600rw-------敏感数据文件

chown:修改所有者

chown(Change Owner)修改文件的所有者和所属组。

# 修改文件所有者
sudo chown root file.txt

# 修改文件所有者和组
sudo chown user:group file.txt

# 只修改组
sudo chown :group file.txt

# 递归修改目录及其内容(-R)
sudo chown -R user:user directory/

注意:修改所有者通常需要 sudo,因为普通用户不能随意把文件"送给"别人。

实际场景:脚本权限问题

场景:编写并运行 Shell 脚本

# 1. 创建脚本文件
cat > hello.sh
#!/bin/bash
echo "Hello, Linux!"
# 按 Ctrl+D 保存

# 2. 查看权限
ls -l hello.sh
# -rw-r--r-- 1 user user 30 Jan 15 10:00 hello.sh

# 3. 尝试执行
./hello.sh
# bash: ./hello.sh: Permission denied

# 4. 添加执行权限
chmod +x hello.sh

# 5. 再次执行
./hello.sh
# Hello, Linux!

特殊权限位

SUID(Set User ID)

执行文件时临时获得文件所有者的权限。

# 典型例子:passwd 命令
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd

# s 出现在所有者权限位,表示 SUID

原理:passwd 需要修改 /etc/shadow(只有 root 能写),但普通用户需要改密码。SUID 让普通用户执行 passwd 时临时获得 root 权限。

SGID(Set Group ID)

对目录:新创建的文件继承目录的组。

# 设置 SGID
chmod g+s shared/

# 新创建的文件自动属于 shared 目录的组

Sticky Bit

对目录:只有文件所有者能删除自己的文件(即使其他人有写权限)。

# 典型例子:/tmp 目录
ls -ld /tmp
# drwxrwxrwt 10 root root ... /tmp

# t 出现在其他人权限位,表示 Sticky Bit

本篇小结

  • 三种权限:r(4) 读、w(2) 写、x(1) 执行
  • 三类用户:u 所有者、g 组、o 其他人
  • chmod 755 file:数字法设置权限,最常用
  • chmod u+x file:符号法添加权限
  • chown user:group file:修改所有者和组
  • 脚本执行前需要 chmod +x 添加执行权限
  • 特殊权限:SUID(临时提权)、SGID(继承组)、Sticky(防误删)

动手实践

  1. 创建脚本并设置权限:

    cat > run.sh
    #!/bin/bash
    echo "Running as $(whoami)"
    # Ctrl+D
    
    ls -l run.sh          # 观察默认权限
    chmod +x run.sh       # 添加执行权限
    ./run.sh              # 执行脚本
    
  2. 权限计算练习:

    touch test1 test2 test3
    chmod 640 test1       # rw-r-----
    chmod 750 test2       # rwxr-x---
    chmod 444 test3       # r--r--r--
    ls -l test*           # 验证你的计算
    
  3. 观察系统命令的 SUID:

    ls -l /usr/bin/passwd
    ls -l /usr/bin/sudo
    ls -ld /tmp
    
  4. 用符号法修改权限:

    chmod u=rwx,g=rx,o=r file.txt
    ls -l file.txt
    
  5. 思考:为什么 /tmp 目录需要 Sticky Bit?如果没有 Sticky Bit,普通用户 A 能删除普通用户 B 在 /tmp 下的文件吗?