Подтвердить что ты не робот

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, что и в системе?

Я уже проверил некоторые предварительные условия:

  • Ruby уже был установлен с помощью apt-get install ruby. Это имеет значение?
  • sshd_config имеет опцию "PermitUserEnvironment yes", и я перезапустил демона.

. Башр на сервере содержит эти строки, но я вижу такое же поведение, когда я их удаляю:

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
4b9b3361

Ответ 1

На странице ssh man:

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

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

Решение

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

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

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

Ответ 2

Собственно, ваш ~/.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

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

Ответ 3

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

Вы добавляете " PermitUserEnvironment yes" в свой sshd_config в /etc/ (open) 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 (не только для всей системы)

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

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

Voila!

Ответ 4

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

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

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

Существует одно разумное решение:

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

  • (при использовании Capistrano) Не используйте rvm1/capistrano3 или rvm/capistrano; не устанавливайте: pty.

  • Измените ~/.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 

Ответ 8

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

Ответ 9

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

Ответ 10

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