CentOS7非root用户执行cap -v遇权限拒绝问题求助
嘿,这个权限坑我当初踩过好几次!既然root能正常跑cap -v,非root不行,那肯定是某个Capistrano依赖的目录非root用户没权限访问,咱们一步步来定位解决:
1. 用strace直接定位被拒绝的路径
这是最直接的方法,能精准抓到哪个文件/文件夹权限不够。非root用户下执行:
strace cap -v 2>&1 | grep -E '(EACCES|Permission denied)'
执行后会输出所有权限相关的错误信息,一眼就能看到被拒的路径,解决起来就针对性强了。
2. 检查Capistrano的gem安装目录权限
Capistrano是Ruby gem,如果是root安装的,那非root用户得能读gem目录才行。先看root的gem安装路径:
su - root -c "gem environment" | grep INSTALLATION
再看非root用户的:
gem environment | grep INSTALLATION
如果Capistrano在root的gem目录(比如/usr/local/lib/ruby/gems/),检查这个目录的权限:
ls -ld /usr/local/lib/ruby/gems/ ls -ld /usr/local/lib/ruby/gems/*/gems/capistrano-3.7.2/
要是权限是drwx------或者只有root能访问,就给其他用户加读和执行权限:
sudo chmod -R o+rx /usr/local/lib/ruby/gems/
(担心安全的话,也可以把非root用户加到gem目录所属的用户组,然后给组加读执行权限,更稳妥)
3. 检查用户家目录和临时目录权限
Capistrano会在用户家目录创建缓存文件,也会用到/tmp临时目录。先看家目录权限:
ls -ld ~/
至少得是drwxr-xr-x(755),不然连自己家目录都写不了肯定报错。再看/tmp:
ls -ld /tmp
正常应该是drwxrwxrwt(1777),不对的话就修复:
sudo chmod 1777 /tmp
4. 验证Ruby执行环境的PATH一致性
虽然/usr/bin/ruby权限没问题,但非root用户的PATH可能没包含/usr/local/bin,导致执行的不是你配置的cap。先直接用绝对路径测试:
/usr/local/bin/cap -v
如果这个能跑,那就是PATH的问题,把/usr/local/bin加到非root用户的环境变量里:
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc
5. 终极方案:用户级Ruby环境隔离
要是上面的方法都搞不定,不如干脆给非root用户装个独立的Ruby环境,彻底避开系统级权限问题。比如用rbenv:
# 非root用户下执行 git clone https://github.com/rbenv/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc source ~/.bashrc # 装ruby-build插件用来安装Ruby git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build # 安装和系统同版本的Ruby(替换成你系统的版本号) rbenv install 2.6.6 rbenv global 2.6.6 # 安装Capistrano 3.7.2 gem install capistrano -v 3.7.2
这样非root用户有自己的Ruby和gem,执行cap -v就不会有系统权限限制了。
内容的提问来源于stack exchange,提问作者user28804




