Bash 如何以不同的用户身份执行rbenv?

Bash 如何以不同的用户身份执行rbenv?,bash,rbenv,Bash,Rbenv,我正在用bash编写一个安装脚本,它将在配置新服务器时作为root用户运行。它将为部署用户安装rbenv,并安装一些默认的rubies/gems。我的脚本已经完成了rbenv的设置,但它无法将rubies安装为部署用户。我知道rbenv的设置是正确的,因为当我使用SSH作为部署用户时,我可以像往常一样访问rbenv。以下是我目前掌握的情况: # install rbenv git clone https://github.com/sstephenson/rbenv.git /home/deplo

我正在用bash编写一个安装脚本,它将在配置新服务器时作为root用户运行。它将为部署用户安装rbenv,并安装一些默认的rubies/gems。我的脚本已经完成了rbenv的设置,但它无法将rubies安装为部署用户。我知道rbenv的设置是正确的,因为当我使用SSH作为部署用户时,我可以像往常一样访问rbenv。以下是我目前掌握的情况:

# install rbenv
git clone https://github.com/sstephenson/rbenv.git /home/deploy/.rbenv

# install ruby-build and auto-rehash plugins
git clone https://github.com/sstephenson/ruby-build.git /home/deploy/.rbenv/plugins/ruby-build
git clone https://github.com/sstephenson/rbenv-gem-rehash.git /home/deploy/.rbenv/plugins/rbenv-gem-rehash

# fix permissions since we've been running as root
chown -R deploy:deploy /home/deploy/.rbenv

# setup rbenv
echo "export PATH=\"~/.rbenv/shims:~/.rbenv/bin:$PATH\"" >> /home/deploy/.bashrc
echo 'eval "$(rbenv init -)"' >> /home/deploy/.bashrc

# now install default ruby
sudo -i -u deploy /bin/bash - <<-EOF
    rbenv install $ruby_version
    rbenv global $ruby_version
    echo 'gem: --no-ri --no-rdoc' > ~/.gemrc
    gem install bundler
EOF
#安装rbenv
git克隆https://github.com/sstephenson/rbenv.git /home/deploy/.rbenv
#安装ruby build和auto rehash插件
git克隆https://github.com/sstephenson/ruby-build.git /home/deploy/.rbenv/plugins/ruby build
git克隆https://github.com/sstephenson/rbenv-gem-rehash.git /home/deploy/.rbenv/plugins/rbenv-gem-rehash
#修复权限,因为我们一直以root用户身份运行
chown-R deploy:deploy/home/deploy/.rbenv
#设置rbenv
echo“导出路径=\”~/.rbenv/bin:~/.rbenv/bin:$PATH\“”>/home/deploy/.bashrc
echo'eval“$(rbenv init-”>>/home/deploy/.bashrc
#现在安装默认ruby

sudo-i-u deploy/bin/bash-如果安装了
rbenv
,并且您收到
命令not found
错误,这意味着您可能有路径问题。您将必要的路径放入部署用户的
~/.bashrc
文件中。但是,
bash
仅保证在shell是交互式和非登录的情况下读取
~/.bashrc
。我建议将PATH语句放在一个可读的脚本中,或者在
此处
脚本中提供显式路径

当作为登录shell调用时(根据
sudo-i
),bash将读取
/etc/profile
,如果它存在的话。然后,它将从列表中读取找到的第一个文件(并且只读取第一个文件):
~/.bash\u profile
~/.bash\u login
,和
~/.profile


最后,由脚本创建的
~/.bashrc
文件归root所有。您可能希望确保您的用户有权阅读它,或者通过
chown
授予他所有权,就像您对他的
~/.rbenv
文件所做的那样。

查看~/.bashrc的顶部。您可能会发现以下代码块:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
这意味着,如果bashrc没有以交互方式运行,它将返回


因此,
sudo-i-u deploy/bin/bash-i-我在尝试使用Ansible 2.1在vagrant box上安装ruby-2.2.3和rbenv时遇到了同样的问题

rbenv安装在ubuntu上一个名为
rails
的用户身上,但当ansible连接到我的ubuntu盒时,它松开了env$在/home/rails/.bashrc中定义的路径,默认仅为ansible_env.PATH

假设您已按照以下步骤安装rbenv:

git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
要使路径正常工作,我需要手动设置它,因此对于该特定任务,我执行了以下操作:

- name: install rubies
  become_user: rails
  environment: 
    PATH: "{{ ansible_env.PATH }}:/home/rails/.rbenv/shims:/home/rails/.rbenv/bin "
  shell: '{{ rbenv_shell }} -lc "rbenv install {{ item[0] }}"'
  ...

这将把路径附加到rbenv命令中,以进行ansible_env.path查找,并使其按预期工作。

可能会有所帮助。@devnull谢谢,但这不是问题所在。权限已经正确。我已经添加了我的安装步骤来证明这一点。
sudo-I
将模拟登录shell。在这种情况下,
~/.bashrc
将不会被读取;尝试将变量添加到
~/.profile
~/.login
中。@devnull。这不会改变rbenv的正常使用吗?谢谢。现在,各种bash脚本的加载更加清晰了。然而,rbenv自述文件明确表示要将其添加到Ubuntu上的~/.bashrc中。将init代码移动到
~/.bash_profile
会改变rbenv的正常使用吗?另外,我认为
~/.bashrc
文件是在用户创建时创建的,因为它已经拥有正确的所有权。我还注意到有一个
~/.bashrc
文件,其中包含要加载的代码
~/.bashrc
,如果它存在的话,所以不管它是登录shell还是非登录shell,对吗?我尝试在我的
rbenv
命令之前添加
export PATH
部分,结果成功了。我尝试手动寻找我的
.bashrc
,但没有成功。我不明白为什么。很高兴你让它工作了。如果
~/.profile
源代码
~/.bashrc
,那么这应该适用于登录shell,但仅当
~/.bash\u profile
~/.bash\u login
不存在,或者,如果它们确实存在,请检查以确保它们也源代码
~/.bashrc
。至于另一点,在我猜测为什么手动寻源
~/.bashrc
不起作用,而导出路径起作用(它们应该是相同的)之前,我想看看完整的脚本、完整的.bashrc和完整的错误消息。当做