【问题标题】:How to execute rbenv as a different user?如何以不同的用户身份执行 rbenv?
【发布时间】:2016-05-23 17:48:16
【问题描述】:

我正在用 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

我已经尝试了-i-H-l 的所有组合,我能想到但我不断得到:

/bin/bash: rbenv: 找不到命令

我做错了什么?

【问题讨论】:

  • This 可能会有所帮助。
  • @devnull 谢谢,但这不是问题。权限已经正确。
  • 我已经添加了我的设置步骤来证明这一点。
  • sudo -i 将模拟登录 shell。在那种情况下,~/.bashrc 将不会被读取;尝试将变量添加到 ~/.profile~/.login
  • @devnull rbenv readme explicitly says to add it to ~/.bashrc on Ubuntu。这不会改变 rbenv 的正常使用吗?

标签: bash rbenv


【解决方案1】:

看看你的 ~/.bashrc 的顶部。可能你会发现这段代码:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

这意味着,如果 bashrc 没有以交互方式运行,它就会返回。

因此,sudo -i -u deploy /bin/bash -i - &lt;&lt;-EOF 应该像魅力一样工作

【讨论】:

    【解决方案2】:

    如果安装了rbenv 并且您收到command not found 错误,这意味着您可能遇到了PATH 问题。您将必要的 PATH 放入部署用户的 ~/.bashrc 文件中。然而,bash 仅保证在 shell 交互且非登录时读取 ~/.bashrc。我建议要么将 PATH 语句放在可读取的脚本中,要么更简单地在 here 脚本中提供显式路径。

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

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

    【讨论】:

    • 谢谢。各种 bash 脚本的加载现在更加清晰了。但是,rbenv 自述文件明确表示将其添加到 Ubuntu 上的 ~/.bashrc 中。将初始化代码移动到~/.bash_profile 会改变rbenv 的正常使用吗?
    • 另外,我认为~/.bashrc 文件是在创建用户时创建的,因为它已经拥有正确的所有权。
    • 我也刚刚注意到有一个~/.profile,其中包含要加载~/.bashrc(如果存在)的代码,所以如果它是登录/非登录shell 无关紧要,对吧?
    • 我尝试在我的rbenv 命令之前添加export PATH 部分并且它有效。我尝试手动采购我的.bashrc,但没有奏效。我不明白为什么。
    • 很高兴你能成功。如果~/.profile 来源~/.bashrc,那么这应该适用于登录shell,但前提是~/.bash_profile~/.bash_login 确实 存在,或者如果它们确实存在,请检查以确保他们还来源~/.bashrc。至于另一点,在我猜测为什么手动采购~/.bashrc 不起作用但导出 PATH 起作用(它们应该是相同的)之前,我想查看完整的脚本、完整的 .bashrc 和完整的错误消息.问候,
    【解决方案3】:

    我在尝试使用 Ansible 2.1 在 vagrant box 上安装 ruby​​-2.2.3 和 rbenv 时遇到了同样的问题。

    rbenv 安装在 ubuntu 上名为 rails 的用户上,但是当 ansible 连接到我的 ubuntu 盒子时,它会丢失 env。 $PATH 在 /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 查找并使其按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多