已解决:这是真的吗?是的。
Source: Dev.to
执行摘要
TL;DR: 在 su 后使用 cd 时出现的 Linux “Permission denied” 错误,通常是因为父目录(如 /home)缺少执行 (x) 权限,而不是用户的家目录本身缺少权限。为了解决此问题,只需在父目录上授予遍历权限:
- 快速修复 –
chmod 711 /home(允许遍历但不列出内容)。 - 安全、生产级修复 – 将组所有权改为专用的管理员组,并设置
chmod 750 /home。
在路径中的 所有 目录上都需要执行 (x) 权限才能成功遍历,即使目标目录本身已经拥有完整权限。
问题描述
当服务用户(例如 svc_deploy)在 su 后尝试 cd ~ 时,Shell 可能会返回:
bash: cd: /home/svc_deploy: Permission denied
罪魁祸首往往是父目录 /home。如果 /home 的权限是 700(drwx------)且所有者是 root:root,只有 root 能遍历它。即使 /home/svc_deploy 的权限是 755 并且归服务用户所有,用户仍然无法到达该目录,因为无法通过 /home 这扇“锁住的门”。
解决方案
快速修复 – 为所有人授予遍历权限
# 安全、快速,并且比大多数临时修复更符合最小特权原则
sudo chmod 711 /home
- 效果:
- 所有者 (
root):rwx - 组和其他用户:
--x(仅执行)
- 所有者 (
用户可以遍历 /home 以访问他们拥有的子目录,但仍然无法列出 /home(ls /home 仍会失败)。
安全的基于组的修复
-
创建一个管理员组(如有需要):
sudo groupadd sysadmins -
将你的管理用户添加到该组:
sudo usermod -aG sysadmins dvance # 注销/重新登录或运行 `id` 以验证组成员身份 -
更改所有权并设置受限权限:
sudo chown root:sysadmins /home sudo chmod 750 /home
- 结果:
root和sysadmins组成员可以遍历/home。- 所有其他用户被完全阻止。
- 非管理员用户无法列出目录内容。
较不安全的修复 – 对所有人开放
sudo chmod 755 /home
- 效果:
rwxr-xr-x– 所有人都可以读取和执行。 - 缺点: 任意用户都可以运行
ls -l /home并看到所有家目录,泄露用户名。此方式不适用于生产或合规性要求严格的环境。
方法对比
| 方法 | 命令(s) | 优点 | 缺点 |
|---|---|---|---|
| 快速修复 | chmod 711 /home | 快速,阻止目录列出,适用于所有非 root 用户。 | 所有非 root 用户均可遍历 /home。 |
| 永久修复 | chown root:sysadmins /home; chmod 750 /home | 最安全,粒度控制,遵循最小特权原则。 | 需要组管理和额外的设置。 |
| 彻底方案 | chmod 755 /home | 确保所有人都能访问。 | 不安全;通过目录列出暴露所有用户名。 |
结论
权限是表达意图的手段。确保在需要遍历的路径中的 每个 目录上都设置了执行位 (x)。根据你的安全策略选择合适的修复方案,记录更改,即可恢复正常工作并安心入睡。
原文链接: TechResolve.blog