未记录事实核验 · 状态:现行内容
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
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 = 7rw-= 4+2+0 = 6r-x= 4+0+1 = 5r--= 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 |
掌握检查
- [ ] 看到
-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 #数据工程