未记录事实核验 · 状态:现行内容

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适用于学习 Linux 基本权限位、用户与组角色,并在自建测试文件上练习 chmod、chown 和权限排查,不是适用于所有环境的 Permission denied 修复方案。实践基础题预期先执行失败、加执行权限后成功,需以新建且初始无执行权限的文件、可用的 Shell 和允许执行的挂载环境为前提;已有文件或 noexec 等限制可能使结果不同。排查目录本身的权限使用 ls -ld;ls -l 目录默认列出的是目录内容。生产所有权变更、递归授权、sudo 及 HDFS 操作须按实际授权执行,并检查路径搜索权限、ACL、挂载及其他安全策略;yum、systemctl 和 Hadoop 示例还要求对应工具与环境可用。本次仅作全文结构审阅,未执行命令或外部核验。

文件权限与用户管理 - chmod/chown/sudo 详解

abstract 本文概要

  • 理解 Linux 权限体系(rwx 那一串字符到底什么意思)
  • chmod 修改文件权限
  • chown 修改文件所有者
  • sudo 临时提权
  • 数据工作中的常见权限问题及解决方案

为什么数据工程师要懂权限

你在工作中一定遇到过这些错误:

Permission denied: /data/warehouse/ods/
bash: /opt/spark/bin/spark-submit: Permission denied
ERROR: Cannot write to /var/log/etl/pipeline.log

这些都是权限问题。理解权限,才能快速定位和解决这类报错,而不是一脸懵地找运维。


读懂权限字符串

执行 ls -l 时,第一列就是权限信息:

-rwxr-xr-- 1 alice data 1.2G 2026-03-18 09:30 process.sh
drwxr-x--- 2 alice data 4.0K 2026-03-18 09:00 output/

拆解第一列:

-  rwx  r-x  r--
↑   ↑    ↑    ↑
|   |    |    └── 其他人(Others)的权限:r--(只读)
|   |    └─────── 所属组(Group)的权限:r-x(读+执行)
|   └──────────── 所有者(Owner)的权限:rwx(读+写+执行)
└──────────────── 文件类型:- 是普通文件,d 是目录,l 是链接

权限字母含义:

字符 含义 对文件 对目录
r Read 读 能读取文件内容 能 ls 列出目录内容
w Write 写 能修改文件内容 配合目录的 x 权限通常可创建/删除目录项;删除还可能受 sticky bit 等限制
x Execute 执行 能作为程序执行 能 cd 进入目录
- 无权限 - -

note 目录权限的特殊性

对目录来说,x 权限(执行)= 能进入这个目录。 所以你经常看到目录的权限是 rwxr-xr-x,即使你不会在目录上"执行"什么程序,但 x 是必须的,否则连 cd 进去都不行。


数字权限表示法

除了 rwx 字母,权限还可以用数字表示(实际工作中更常用):

r = 4
w = 2
x = 1
- = 0

把三个权限值加起来:

  • rwx = 4+2+1 = 7
  • rw- = 4+2+0 = 6
  • r-x = 4+0+1 = 5
  • r-- = 4+0+0 = 4
  • --- = 0+0+0 = 0

所以权限 rwxr-xr-- = 754,权限 rwxr-xr-x = 755。

最常用的几个数字组合:

数字 字母表示 含义 典型用途
755 rwxr-xr-x 所有者全权,其他人可读可执行 可执行脚本、目录
644 rw-r--r-- 所有者可读写,其他人只读 普通数据文件
600 rw------- 只有所有者能读写 私钥文件、密码文件
777 rwxrwxrwx 所有人都有全部权限 临时用,生产环境慎用
700 rwx------ 只有所有者有权限 私人目录

chmod - 修改文件权限

# 数字方式(最常用)
chmod 755 process.sh        # 给脚本添加执行权限
chmod 644 data.csv          # 数据文件:所有者读写,其他人只读
chmod 600 ~/.ssh/id_rsa     # 私钥:只有自己能读写

# 递归修改目录权限(-R 参数)
chmod -R 755 /data/scripts/

# 字母方式(语义更清晰)
# u=user(所有者),g=group(组),o=others(其他),a=all(所有人)
# +=添加权限,-=移除权限,==设置权限

chmod +x process.sh             # 添加执行权限;省略 u/g/o 时受 umask 影响,明确给所有角色添加可用 chmod a+x
chmod u+x process.sh            # 只给所有者添加执行权限
chmod g-w data.csv              # 移除组的写权限
chmod o-r private.txt           # 移除其他人的读权限
chmod a+r public_data.csv       # 所有人都可读
chmod u=rwx,g=rx,o=r script.sh  # 精确设置每个角色的权限

tip 最常用的场景:给脚本添加执行权限

# 写完 Shell 脚本,发现不能执行
./run_etl.sh
# bash: ./run_etl.sh: Permission denied

# 解决:添加执行权限
chmod +x run_etl.sh

# 或者用数字
chmod 755 run_etl.sh

# 再执行
./run_etl.sh  # 若缺少执行权限是唯一阻碍,且解释器、路径权限及挂载策略允许,此时可执行

chown - 修改文件所有者

# 修改文件所有者
chown alice data.csv

# 修改文件所有者和所属组(冒号分隔)
chown alice:data data.csv

# 只修改所属组
chown :data data.csv
# 等效于
chgrp data data.csv

# 递归修改目录下所有文件
chown -R alice:data /data/warehouse/

# 查看用户和组信息
id                 # 查看当前用户的 uid、gid、所属组
id alice           # 查看指定用户
groups             # 查看当前用户所在的所有组

note 什么时候用 chown

  • 运维部门创建了目录,所有者是 root,你的用户没有写权限 → 让运维 chown 改给你
  • 自动化脚本创建的文件所有者是 root,你的程序无法写入 → 检查脚本用什么用户在跑
  • 多团队共享目录,需要统一设置组权限

sudo - 临时提权

sudo(Substitute User Do)允许普通用户以 root 或其他用户身份执行命令。

# 以 root 权限执行命令
sudo chmod 1777 /tmp/shared/  # 仅适用于明确允许所有用户写入的临时共享目录;sticky bit 限制删除他人目录项,不保护文件内容
sudo systemctl restart nginx
sudo yum install -y python3

# 查看当前用户能执行哪些 sudo 命令
sudo -l

# 切换到 root 用户(切换后的命令都以 root 执行)
sudo su
sudo su -   # 裸 - 等同于 -l,启动 root 的登录 shell 并按登录规则初始化环境

# 以指定用户身份执行命令
sudo -u hadoop /opt/hadoop/bin/hdfs dfs -ls /

# 编辑只有 root 能修改的文件
sudo vim /etc/hosts
sudo vim /etc/hadoop/core-site.xml

warning sudo 的使用原则

  • 只在确实需要的时候用 sudo
  • 不要长期在 sudo su 的 root 会话里工作(容易误操作)
  • 永远不要 sudo rm -rf / 或 sudo rm -rf /*

tip 常见权限错误快速解决

# 错误:Permission denied 写文件
# 原因:你没有写权限
# 解决:
sudo chown 你的用户名 文件名     # 改所有者
# 或
chmod u+w 文件名                  # 仅增加文件所有者的写权限;当前用户须为所有者才可能因此获得写权限,执行者也须有修改权限的授权

# 错误:Permission denied 执行脚本
# 解决:
chmod +x 脚本名.sh

# 错误:Permission denied 进入目录
# 原因:目录没有 x 权限
# 解决:
chmod +x 目录名
# 或
chmod 755 目录名

用户和组管理(了解即可)

数据工程师一般不负责创建用户,但了解基本概念有助于理解权限问题。

# 查看系统所有用户
cat /etc/passwd

# 查看系统所有组
cat /etc/group

# 查看当前登录用户
whoami

# 查看所有登录用户
who

# 查看用户详细信息
id alice
# uid=1001(alice) gid=1001(alice) groups=1001(alice),1002(data),1003(hadoop)

权限问题排查思路:

# 1. 确认目录自身权限
ls -ld /data/warehouse/ods/

# 2. 确认当前用户是谁
whoami
id

# 3. 判断当前用户属于哪个角色(owner/group/others)
# 根据文件的 owner 和 group,对比 id 输出

# 4. 对应角色的权限是否满足需求
# 如果不满足,联系有权限的人修改

常见权限场景

场景 1:SSH 密钥权限太宽

# 错误:ssh 时提示 WARNING: UNPROTECTED PRIVATE KEY FILE!
# 原因:私钥文件权限太宽,ssh 拒绝使用

# 解决:
chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh/

场景 2:脚本无法执行

# 错误:-bash: ./etl.sh: Permission denied

# 检查权限
ls -l etl.sh
# -rw-r--r-- 1 alice data 1234 2026-03-18 etl.sh

# 解决:添加执行权限
chmod u+x etl.sh
# 或
chmod 755 etl.sh

场景 3:写不了日志文件

# 错误:open /var/log/etl/pipeline.log: permission denied

# 检查目录权限
ls -ld /var/log/etl/
# drwxr-xr-x 2 root root 4.0K 2026-03-18 /var/log/etl/

# 目录属于 root,你的用户只有读和执行权限,没有写权限

# 解决方案示例(让运维确认目录用途及递归修改范围后执行):
sudo chown -R alice:data /var/log/etl/
# 或:通过 data 组共享目录,前提是写入用户属于 data 组
sudo chgrp data /var/log/etl/
sudo chmod 775 /var/log/etl/
# 若 pipeline.log 已存在,还需检查并按授权需求调整该文件的所属组和写权限

场景 4:Hadoop/HDFS 权限问题

# HDFS 也有权限体系,和 Linux 类似
# 查看 HDFS 文件权限
hdfs dfs -ls /user/alice/

# 修改 HDFS 文件权限
hdfs dfs -chmod 755 /user/alice/output/
hdfs dfs -chown alice:data /user/alice/output/

快速参考

命令 用途 示例
ls -l 查看权限 ls -l file.sh
chmod 755 数字方式设权限 chmod 755 script.sh
chmod +x 添加执行权限 chmod +x run.sh
chown user:group 修改所有者 chown alice:data data/
sudo 命令 临时提权 sudo vim /etc/hosts
id 查看当前用户信息 id
whoami 显示当前用户名 whoami


info 前置知识


掌握检查

  • [ ] 看到 -rwxr-xr-- 能快速说出:所有者有读写执行权限,所属组有读和执行权限,其他人只有读权限
  • [ ] 能说出数字权限的计算方式:r=4、w=2、x=1,755 对应的是什么含义
  • [ ] 知道直接执行脚本通常需要相应执行权限;权限不足时可由有授权的人按用户角色调整,也可在解释器能够读取脚本时通过解释器运行,遇到 Permission denied 时先检查文件及路径权限
  • [ ] 能用 sudo chown -R alice:data /data/project/ 递归修改目录所有者
  • [ ] 理解普通用户和 root 的区别,知道为什么不建议直接用 root 账号日常操作

实践练习

基础题:在隔离练习目录中新建无执行权限的脚本,确认没有同名旧文件,写入可用Shell的shebang和 echo "hello world"。在允许执行的挂载环境中先尝试直接执行,再用 chmod u+x 后重试,并用 ls -l 查看权限位;结果仍受路径权限、解释器及其他安全策略影响。

进阶题:用 ls -l 查看 /etc/passwd 和 /etc/shadow 两个文件的权限,说明为什么普通用户可以读 /etc/passwd 但不能读 /etc/shadow,这个设计解决了什么安全问题。


下一步

#Linux #文件权限 #chmod #sudo #数据工程