问题与目标
程序找不到配置、日志无法写入、部署脚本提示无权限,往往不是 Python 语法问题,而是路径、所有者或权限不正确。本篇用一个工作目录串起文件操作、查找、压缩和权限管理。
完成标准:能判断路径是相对还是绝对,能找到文件、查看权限,并用最小权限修复访问问题。
核心概念
Linux 从根目录 / 组织文件。常见目录包括:/etc 放系统配置,/var/log 放日志,/home 放普通用户数据,/tmp 放临时文件。
权限分为所有者、所属组、其他用户三组,每组包含读 r、写 w、执行 x。目录的 x 表示能否进入或穿过,只有 r 并不保证能访问目录内文件。
数字权限中 r=4、w=2、x=1,例如 750 表示所有者可读写执行、组可读执行、其他用户无权限。权限修复应先确定程序以谁的身份运行,再决定是否改所有者、组或权限。
常用文件操作可以围绕路径变化理解:
| 命令 | 作用 | 需要特别确认的地方 |
|---|---|---|
cp source target | 复制 | 目标存在时可能覆盖 |
mv source target | 移动或改名 | 目标路径与跨文件系统行为 |
rm file | 删除 | 默认不可从 Git 恢复未跟踪文件 |
ln -s target link | 创建符号链接 | 相对目标按链接所在位置解析 |
ls -la | 查看含隐藏文件的目录 | 文件名以 . 开头即隐藏 |
通配符由 Shell 展开:*.log 表示当前目录匹配的名称,不是递归查找。需要按类型、名称、时间或大小递归查找时使用 find。
可运行实现
mkdir -p ~/permission-demo/{input,output}
cd ~/permission-demo
printf 'level=INFO\nmessage=service_started\n' > input/app.log
pwd
ls -lah input
find . -type f -name '*.log'
grep -n 'service_started' input/app.log
tar -czf logs.tar.gz input
tar -tzf logs.tar.gz
stat input/app.log
chmod 640 input/app.log
chmod u+x input/app.log
ls -l input/app.log
这个练习的输入是目录、日志文件和目标权限,输出包括查找到的文件、压缩包目录以及 ls -l/stat 展示的所有者与权限。验收时应能逐位解释最终权限,而不是只确认命令没有报错。
640 适合“所有者读写、同组只读、其他用户不可访问”的普通数据文件。若服务由专用组读取,可以调整所属组:
sudo chgrp appreaders input/app.log
chmod 640 input/app.log
用户与组应按服务边界建立,而不是让所有程序共用登录账号:
sudo groupadd --system appreaders
sudo useradd --system --gid appreaders --no-create-home appsvc
id appsvc
getent passwd appsvc
getent group appreaders
chmod u+x file 是符号写法,表示给所有者增加执行权限;chmod g-w file 表示移除组写权限。数字写法适合一次设定完整权限,符号写法适合只改变某一位。
执行前应先用 getent group appreaders 确认组存在。不要把 chmod 777 当作通用修复方案。
常见问题与排查
遇到 Permission denied,按顺序检查:
whoami
id
namei -l /absolute/path/to/file
ls -ld /absolute/path/to /absolute/path/to/file
- 相对路径错误:用
pwd确认当前目录,服务进程的工作目录未必等于源码目录。 - 复制或移动结果与预期不同:执行前用
ls -ld -- source target核对展开后的对象,脚本中始终给路径加引号。 - 符号链接失效:使用
readlink -f 链接检查最终目标;相对链接在整体搬迁时通常更容易保持有效。 - 文件可读但父目录不可进入:检查路径上每一级目录的
x权限。 sudo创建了 root 文件:优先用chown恢复正确所有者,不要让程序长期以 root 运行。- 磁盘写满也可能表现为写入失败:使用
df -h和du -sh 目录检查。
小结
路径故障要同时看“文件在哪里”和“进程以谁的身份访问”。pwd、namei -l、stat 和 id 能把模糊的权限报错拆成可验证的问题。
许可协议:CC BY-NC 4.0
更新于 1 小时前
觉得文章有帮助?点个赞吧!
0 条评论


