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
Ответы
Ответ 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