RVM无法通过SSH工作

时间:2011-08-02 20:58:13

标签: ruby ssh rvm

RVM无法通过SSH工作。

在命令行:

leifg@host:~$ which ruby
/usr/local/rvm/rubies/ruby-1.9.2-p290/bin/ruby

通过SSH连接:

local:~$ ssh leifg@server 'which ruby'
/usr/bin/ruby

我正在使用Ubuntu 11.04。

如何让SSH使用与系统相同的Ruby?

我已经验证了一些先决条件:

  • Ruby已使用apt-get install ruby安装。这有什么不同吗?
  • sshd_config有“PermitUserEnvironment yes”选项,我重启了该守护进程。

服务器上的.bashrc包含这些行,但是当我删除它们时会看到相同的行为:

if [ -s "$HOME/.rvm/scripts/rvm" ] ; then
  . "$HOME/.rvm/scripts/rvm"
elif [ -s "/usr/local/rvm/scripts/rvm" ] ; then
  . "/usr/local/rvm/scripts/rvm"
fi

10 个答案:

答案 0 :(得分:49)

实际上,您的〜/ .bashrc将被执行。问题通常是添加

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

...文件底部的代码段。但是,ubuntu系统上的默认.bashrc包括以下顶部附近的

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

该调用将停止执行脚本的其余部分,因此不会设置正确的路径。因此,您可以将rvm调用放在文件的顶部或删除返回调用。

答案 1 :(得分:19)

来自ssh手册页:

  

如果指定了命令,则在远程主机上执行,而不是   登录shell。

这应该意味着您的.bashrc将无法获取,因此RVM无法设置。

<强>解决方案

这最终成功了:

ssh <host> bash --login -c <command>

通过SSH启动bash作为登录shell,然后通过SSH的-c选项启动RVM安装的Ruby。

答案 2 :(得分:16)

实际上还有另一种更安全,更轻便的选择。

您可以在/ etc /(open)ssh中的 sshd_config 处添加“ PermitUserEnvironment yes

现在您可以在/home/user/.ssh/environment中指定用户环境。那么你把它放在那里?

就像:

user# env | grep rvm > ~/.ssh/environment

所以看起来如下:

user@app3:~$ cat ~/.ssh/environment 
rvm_bin_path=/usr/local/rvm/bin
GEM_HOME=/usr/local/rvm/gems/ree-1.8.7-2012.02
IRBRC=/usr/local/rvm/rubies/ree-1.8.7-2012.02/.irbrc
MY_RUBY_HOME=/usr/local/rvm/rubies/ree-1.8.7-2012.02
rvm_path=/usr/local/rvm
rvm_prefix=/usr/local
PATH=/usr/local/rvm/gems/ree-1.8.7-2012.02/bin:/usr/local/rvm/gems/ree-1.8.7-2012.02@global/bin:/usr/local/rvm/rubies/ree-1.8.7-2012.02/bin:/usr/local/rvm/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
rvm_version=1.14.5 (stable)
GEM_PATH=/usr/local/rvm/gems/ree-1.8.7-2012.02:/usr/local/rvm/gems/ree-1.8.7-2012.02@global

注意:这也适用于用户安装RVM(不仅适用于系统范围)

现在您可以在ssh非交互式会话中使用ruby:

ssh user@app3 'ruby --version'
ruby 1.8.7 (2012-02-08 MBARI 8/0x6770 on patchlevel 358) [x86_64-linux], MBARI 0x6770, Ruby Enterprise Edition 2012.02

瞧!

答案 3 :(得分:3)

“rvm”有两个调用错误:默认安装会删除文件/etc/profile.d/rvm.sh并认为任何bash技巧现在全局可用。 - 这个假设是错误的。

/etc/profile.d/中的文件在登录时“来源”,但可能不是来自bash,甚至可能不是来自shell。因此,在运行这些文件的shell退出后,它所安装的cd挂钩不存在。实际上,由于“rvm”的错误方式安装了这个钩子,一旦你在登录shell中运行裸bash,它就已经消失了!

我不知道“rvm”是否支持虚拟环境的显式调用,而不依赖cd进入某个目录(我认为是第二个错误)。

有一个明智的解决方法:

从中获取您的shell来源/etc/profile.d/rvm.sh~/.bashrc.bashrc是从任何非登录bash执行的,login-bash通常设置为来自.bashrc

等登录shell文件的源~/.profile

对于你的ssh问题:反正的ssh-shell不应该是login-shell吗?

答案 4 :(得分:2)

我刚刚在〜/ .bashrc(对于git用户)的顶部添加了这个字符串:

[[ -s "/usr/local/rvm/scripts/rvm" ]] && source "/usr/local/rvm/scripts/rvm"

答案 5 :(得分:1)

提到的解决方案工作当然没问题,但是我的运行

source /usr/local/rvm/environments/<ruby version>@<gemset version>

在远程ssh调用开始时。类似的东西:

ssh -l <remote username> <server ip> "source /usr/local/rvm/environments/<ruby version>@<gemset version> ; <rest of the remote script>"

答案 6 :(得分:1)

  1. (如果使用Capistrano) Don&#t; 使用rvm1 / capistrano3或rvm / capistrano; 设置:pty。

  2. 将服务器上的跑步者用户的~/.rvmrc更改为此 - 请注意,在未以交互方式运行时,必须来之前行杀死自己的行:< / p>

  3. # get rvm for non-interactive shells (eg capistrano) too
    source /etc/profile.d/rvm.sh
    export BASH_ENV=$HOME/.bashrc
    export rvm_is_not_a_shell_function=0
    
    # If not running interactively, don't do anything
    [ -z "$PS1" ] && return 
    

答案 7 :(得分:1)

我遇到了同样的问题。我意识到,我偶然也为多个用户安装了RVM。删除目录 / usr / local / rvm 并编辑zoonmix建议的〜/ .bashrc 后,问题就解决了。

答案 8 :(得分:0)

确保在服务器上已经完成了rvm --default 1.9.2之类的操作,将RVM的Ruby设置为默认值。否则,它将始终使用默认系统Ruby。

答案 9 :(得分:0)

zoomix是最好的解决方案。但是当您在终端中使用“ruby rvm use system”进行更改时,您还会收到其他错误: 警告! PATH没有正确设置,不是第一位....要解决这个问题,请将片段放在返回之前,而不是放在.bashrc文件的顶部(Debian Jessie这里)

case $- in
*i*) ;;
  *) 
  [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
  return;; esac