2011-08-02 85 views
21

RVM無法通過SSH工作。RVM無法通過SSH工作

在命令行:

[email protected]:~$ which ruby 
/usr/local/rvm/rubies/ruby-1.9.2-p290/bin/ruby 

連接通過SSH:

local:~$ ssh [email protected] 'which ruby' 
/usr/bin/ruby 

我使用Ubuntu 11.04。

如何讓SSH使用與系統上相同的Ruby?

我已經驗證了一些prequisites:

  • 紅寶石已經安裝使用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 
+0

你是什麼意思是'over ssh'?通過SSH到你的同一個系統? – fl00r

+0

我想使用ssh user @ host'command'語法在另一個系統上執行ruby,就像2個代碼片段中所解釋的那樣。在這種情況下,這些是2個獨立的機器。 – leifg

+0

哇。所以你應該首先在你的遠程系統上安裝rvm – fl00r

回答

18

ssh手冊頁:

如果指定了命令,它是在遠程主機而不是 登錄shell執行。

這應該意味着您的.bashrc不會來源,所以RVM不會被設置。

解決方案

這並獲得成功到底:

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

開始bash作爲通過SSH登錄shell,然後啓動RVM通過SSH的-c選項安裝紅寶石。

+1

所以換句話說:沒有解決方案嗎? – leifg

+0

您執行命令之前嘗試手動採購嗎?或者手動設置適當的env變量? –

+0

請參閱評論我的問題,沒有幫助 – leifg

0

確保在服務器上,你做了什麼樣rvm --default 1.9.2設置RVM的Ruby作爲默認值。否則,它將始終使用默認的系統Ruby。

+0

我已經驗證, – leifg

48

其實你的〜/ .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呼叫置於文件的頂部,也可以取消返回呼叫。

+0

這是正確的解決方案!複製上面的代碼片段,在你的.bashrc的頂部添加「rvm --default 1.9.2」,你是金手指。 – ayckoster

+0

謝謝,這終於解決了! +1000 – galymzhan

+0

實際上'〜/ .bashrc'並不總是被執行。 – vikki

16

實際上有另一種更安全和輕量級的選擇。

您添加 「的PermitUserEnvironment是」 在某處你的sshd_config在/ etc /(開)SSH

現在你可以在/home/user/.ssh/environment指定的用戶環境。那麼你在那裏放什麼?

就類似:

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

所以它看起來象下面這樣:

 
[email protected]:~$ 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/[email protected]/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/[email protected] 

注:這也適用勞動用戶安裝RVM(不僅爲全系統)

現在你可以在ssh非交互式會話中使用ruby:

 
ssh [email protected] '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 

瞧!

+0

我最喜歡這個,它絕對看起來是最乾淨的。它對我很好。謝謝! (哦,我用VirtualMin使用CentOS) –

+0

我不喜歡它使用確切的版本號。爲什麼不把它留給rvm? –

+0

是的 - 爲什麼不!:) – wojciechz

1

提到的解決方案的工作當然不錯,但我的是在遠程SSH呼叫開始運行

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

。喜歡的東西:

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

這對我有效。 – maicher

1
  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 
1

我有同樣的問題。我意識到,我也意外地爲多個用戶安裝了RVM。刪除目錄/usr/local/rvm並編輯〜/ .bashrc就像zoonmix建議的那樣,問題就解決了。

2

我剛剛在〜/ .bashrc中的頂部增加(爲git的用戶)此字符串:

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

「RVM」有兩種調用錯誤:默認安裝降到文件/etc/profile.d/rvm.sh,並相信任何bash技巧現在全球可用。 - 這個假設是錯誤的。

/etc/profile.d/中的文件在登錄時是「sourced」的,但可能不是來自bash,甚至可能不是來自shell。因此,在運行這些文件的shell退出後,它安裝的cd掛鉤不存在。實際上,由於「rvm」這個錯誤的方法安裝了這個鉤子,一旦你在登錄shell中運行bash,它就已經消失了!

我不知道「rvm」是否支持虛擬環境的顯式調用,而不依賴於某個目錄(我認爲是第二個錯誤)的cd

有一個理智的解決方法:

從例如讓你的shell源/etc/profile.d/rvm.sh~/.bashrc.bashrc從任何非登錄bash的執行,和登錄的bash通常是安裝源.bashrc從這些登錄殼文件,比如~/.profile

對於你的ssh的問題:應該在適當的SSH殼無法登錄殼呢?

0

zoomix's是最好的解決方案。但是,當您在終端中使用「ruby rvm use system」進行更改或者出現以下錯誤時: 警告!路徑未正確設置,是不是在首位....爲了解決這個把片段在.bashrc文件的頂部返回之前,而不是(Debian的傑西在這裏)

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