RVM не работает над SSH - PullRequest
       3

RVM не работает над SSH

22 голосов
/ 03 августа 2011

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 ]

49 голосов
/ 23 августа 2011

На самом деле ваш ~ / .bashrc будет выполнен.Обычно проблема заключается в том, что в конец файла добавляется фрагмент

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

....Тем не менее, .bashrc по умолчанию в системах Ubuntu включает следующее в верхней части

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

Этот вызов прекратит выполнение остальной части скрипта и, следовательно, не установит правильные пути.Таким образом, вы можете поместить вызов rvm вверху файла или удалить обратный вызов.

19 голосов
/ 03 августа 2011

со страницы руководства ssh:

Если указана команда, она выполняется на удаленном хосте вместо оболочка входа в систему.

Это должно означать, что ваш .bashrc не будет получен, поэтому RVM не настроен.

Решение

Это сделало трюк в конце концов:

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

Запустите bash в качестве оболочки для входа через SSH, а затем запустите установленный RVM Ruby через SSH, параметр -c.

16 голосов
/ 10 января 2013

На самом деле есть еще один, более безопасный и легкий вариант.

Вы добавляете " PermitUserEnvironment yes " где-нибудь в sshd_config в / etc / (open) ssh

Теперь вам разрешено указывать пользовательскую среду в /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 (не только для всей системы)

Теперь вы можете использовать ruby ​​в неинтерактивных сессиях ssh:

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

Voila!

3 голосов
/ 10 февраля 2015

«rvm» имеет две ошибки вызова: установка по умолчанию удаляет файл /etc/profile.d/rvm.sh и считает, что любой трюк bash теперь доступен глобально.- Это предположение неверно.

Файлы в /etc/profile.d/ «исходят» при входе в систему, но, возможно, не из bash, может даже не из оболочки.Таким образом, хук cd, который он устанавливает, отсутствует после выхода из оболочки, которая запускает эти файлы.На самом деле, из-за ошибочного способа, которым «rvm» устанавливает этот хук, он уже исчез, когда вы запускаете «голый» bash в оболочке входа в систему!

Я не знаю, поддерживает ли «rvm» явный вызовдля виртуальных сред, не полагаясь на cd вход в какой-то каталог (который я считаю второй ошибкой).

Существует один вменяемый обходной путь:

Сделайте ваш источник оболочки /etc/profile.d/rvm.sh из, например,~/.bashrc..bashrc выполняется из любого не-входа в bash, а login-bash обычно настраивается на источник .bashrc из таких файлов оболочки входа, как ~/.profile

Для вашей проблемы с ssh: должен быть правильный ssh-shell не будет логином-оболочкой?

2 голосов
/ 29 декабря 2014

Я только что добавил в начало ~ / .bashrc (для пользователя git) эту строку:

[[ -s "/usr/local/rvm/scripts/rvm" ]] && source "/usr/local/rvm/scripts/rvm"
1 голос
/ 15 июля 2014

У меня была такая же проблема.Я понял, что случайно установил RVM для нескольких пользователей.После удаления каталога / usr / local / rvm и редактирования ~ / .bashrc , как предложил zoonmix, проблема была решена.

1 голос
/ 13 марта 2014
  1. (при использовании Capistrano) Не использовать rvm1 / capistrano3 или rvm / capistrano; not set: 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 голос
/ 21 февраля 2013

Упомянутые решения работают, конечно, хорошо, но мое должно было работать

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>"
0 голосов
/ 30 марта 2017

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
0 голосов
/ 03 августа 2011

Убедитесь, что на сервере вы сделали что-то вроде rvm --default 1.9.2, чтобы установить Ruby RVM по умолчанию.В противном случае он всегда будет использовать систему по умолчанию Ruby.

...