背景 需要一个专用备份用户 backup_reader,能读到 /home/user/backups/ 目录下的文件。
目录是 /home/user/backups/,但 /home/user 的权限是 drwxr-x---(只有 user 和 user 组能进)。backup_reader 进不去,读不到里面的文件。
原因 Linux 权限系统只有三类人:owner、group、other。想给"一个特定的其他用户"开放权限,标准权限模型做不到,只能用这两种粗暴方案:
| 方案 | 命令 | 问题 |
|---|---|---|
| 方案一:放开 other 权限 | chmod o+x /home/user |
所有人都能穿过,太开放 |
| 方案二:加入 user 组 | usermod -aG user backup_reader |
加入 user 组,能看整个家目录 |
都不够精确。我们需要的是:只给 backup_reader 一个人开放这一条路径。
解决:ACL ACL(Access Control List)是 Linux 的"更细粒度权限贴纸"。
bash
# 1. 装工具
sudo apt install -y acl
# 2. 给 backup_reader 开一扇窗
sudo setfacl -m u:backup_reader:x /home/user
# 3. 看效果
getfacl /home/user
验证效果
sql
# file: home/user
# owner: user
# group: user
user::rwx
user:backup_reader:--x ← 关键
group::r-x
other::---
解读:
user::rwx --- user 本人,读写执行
user:backup_reader:--x --- 只给 x(穿过),不给 r(列目录)
other::--- --- 其他用户,无权限
验证:
bash
# backup_reader 能直接读已知文件
sudo -u backup_reader cat /home/user/backups/foo.tar.gz | head -c 10
# → OK
# backup_reader 不能列目录
sudo -u backup_reader ls /home/user/
# → Permission denied ← 这才是我们想要的
三个坑 坑 1:setfacl 默认没装
Ubuntu 最小化安装没带 acl 包,直接跑 setfacl 会报:
bash
sudo: 'setfacl': command not found
先 apt install acl,一条命令的事,但不知道就会卡住。
坑 2:ACL 不覆盖 chmod
如果之后执行 chmod 700 /home/user,可能会覆盖掉 ACL。改完权限用 getfacl 复查。
坑 3:x 和 r 要分清
所以 backup_reader 只需要 x 就能 cat /home/user/backups/foo.tar.gz,不需要 r 去列 /home/user/。 很多人以为要读文件必须先"能列目录",其实不是:
| 权限 | 含义 |
|---|---|
r |
列目录,能看到里面所有文件名 |
x |
穿过目录,能按已知名字访问里面的文件 |
| 只要 x,就能做到"知道名字就能取,不知道就逛不了"。这正是备份场景想要的------脚本按固定文件名取,不需要列目录。 |