Ruby on Rails报dir_initialize权限拒绝错误 chown命令修复无效
Ruby on Rails Errno::EACCES 权限报错排查解决
报错信息
运行Rails项目时触发如下错误:
in `initialize': Permission denied @ dir_initialize - /home/HirushaFernando/picq-web/db/store/397/397452a5-c254-4025-90cc-6884ae4eab04/202207_302756_302756_0 (Errno::EACCES)
此前尝试执行sudo chown -R User:User db/修复未生效。
排查步骤
- 先确认Rails进程的实际运行用户:改错属主的核心原因通常是不知道服务实际跑在哪个账号下,如果你是用systemd、Puma、Nginx托管服务,运行用户可能是
www-data、deploy等专用账号,并非你当前登录的用户。执行以下命令查看进程所属用户:
输出结果第一列的用户名就是Rails进程的实际运行账号。ps aux | grep -E 'puma|rails|unicorn' - 校验全路径权限:不要只看db目录本身,从根目录到目标路径的任意一级没有执行权限,都会导致访问被拒。执行以下命令可以逐级列出路径所有层级的属主和权限:
对照输出找到权限不匹配的层级即可。namei -l /home/HirushaFernando/picq-web/db/store/397/397452a5-c254-4025-90cc-6884ae4eab04/202207_302756_302756_0 - 校验之前chown操作的有效性:你之前执行命令用的是相对路径
db/,如果执行命令时不在项目根目录/home/HirushaFernando/picq-web下,修改的根本不是项目内的db目录;另外命令里写的User:User是占位符,Linux系统默认不存在名为User的用户,这也是操作不生效的常见原因。 - 检查目录特殊属性:如果目录被加了不可修改(i)属性,即使是root用户也无法写入内容,执行以下命令查看属性:
输出如果带lsattr /home/HirushaFernando/picq-web/db/i标记说明被加了锁。
修复操作
- 进入项目根目录后,把你之前chown命令里的
User替换成实际查到的Rails运行用户,比如运行用户是当前登录的hirusha,就执行:
如果是Nginx+Puma部署的服务,运行用户通常是www-data,对应替换为sudo chown -R hirusha:hirusha /home/HirushaFernando/picq-web/db/www-data:www-data即可。 - 递归给属主分配db目录的正确权限,注意用大写X避免给普通文件误加执行权限,比直接开777更安全:
chmod -R u+rwX /home/HirushaFernando/picq-web/db/ - 如果排查到上层目录(比如家目录
/home/HirushaFernando)缺少执行权限,给对应层级补执行权限即可,不要随意修改系统目录权限:chmod u+x /home/HirushaFernando - 如果查到目录被加了不可修改属性,先递归移除属性再重新配置权限:
sudo chattr -i -R /home/HirushaFernando/picq-web/db/
禁止为了省事直接给db目录设置777权限,生产环境这么做会有极大的数据泄露和篡改风险。
内容的提问来源于stack exchange,提问作者Hirusha Randunu
相关产品推荐
相关产品推荐

