RVM无法通过SSH工作

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?

我已经validation了一些先决条件:

  • 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 

ssh手册页:

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

这应该意味着您的.bashrc不会被获取,因此RVM不会被设置。

这最终成功了:

 ssh  bash --login -c  

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

实际上,你的〜/ .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调用放在文件的顶部或删除返回调用。

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

你在/ etc /(open)ssh中的sshd_config中添加了“ PermitUserEnvironment yes

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

就像这样:

用户#env |  grep rvm>〜/ .ssh / environment

所以看起来如下:

 user @ app3:〜$ cat~ / .ssh / environment 
 rvm_bin_path =在/ usr /本地/ RVM /箱
 GEM_HOME =的/ usr /本地/ RVM /gem/ REE-1.8.7-2012.02
 IRBRC =的/ usr /本地/ RVM /ruby/ REE-1.8.7-2012.02 / .irbrc
 MY_RUBY_HOME =的/ usr /本地/ RVM /ruby/ REE-1.8.7-2012.02
 rvm_path =的/ usr /本地/ RVM
 rvm_prefix =的/ usr /本地
 PATH =在/ usr /本地/ RVM /gem/ REE-1.8.7-2012.02 /斌:/usr/local/rvm/gems/ree-1.8.7-2012.02@global/bin:在/ usr /本地/ RVM /ruby/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(稳定)
 GEM_PATH =在/ usr /本地/ RVM /gem/ 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-2-08 MBARI 8 / 0x6770,补丁级别358)[x86_64-linux],MBARI 0x6770,Ruby Enterprise Edition 2012.02

瞧!

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

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

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

有一个明智的解决方法:

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

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

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

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

提到的解决方案工作肯定很好,但我的运行

 source /usr/local/rvm/environments/@ 

在远程ssh调用的开始。 就像是:

 ssh -l   "source /usr/local/rvm/environments/@ ; " 
  1. (如果使用Capistrano) 请勿使用rvm1 / capistrano3或rvm / capistrano; 设置:pty。

  2. 将服务器上的转轮用户的~/.rvmrc更改为此 – 请注意,它必须在未以交互方式运行时杀死自己的行之前

 # 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 

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

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

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