RVM ne fonctionne pas sur SSH
RVM ne fonctionne pas sur SSH.
Sur la ligne de commande:
leifg@host:~$ which ruby
/usr/local/rvm/rubies/ruby-1.9.2-p290/bin/ruby
Connecté via SSH:
local:~$ ssh leifg@server 'which ruby'
/usr/bin/ruby
J'utilise Ubuntu 11.04.
Comment puis-je faire en sorte que SSH utilise le même Ruby que sur le système?
J'ai déjà vérifié quelques pré-Conditions:
- Ruby était déjà installé en utilisant
apt-get install ruby
. Cela fait-il une différence? -
sshd_config
A l'option "PermitUserEnvironment yes", et j'ai redémarré le démon.
Le .bashrc sur le serveur contient ces lignes, mais je vois le même comportement quand je les supprime:
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 réponses
De la page de manuel ssh
:
Si la commande est spécifiée, elle est exécutée sur l'hôte distant au lieu de un shell de connexion.
Cela devrait signifier que votre .bashrc
ne sera pas sourcé, donc RVM ne sera pas configuré.
Solution
Cela a fait l'affaire à la fin:
ssh <host> bash --login -c <command>
Démarrez bash en tant que Shell de connexion via SSH, puis démarrez le Ruby installé par RVM via l'option -c
de SSH.
En fait, votre ~/.bashrc sera exécuté. Le problème est généralement que l'on ajoute le
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
... extrait à la fin du fichier. Toutefois, la valeur par défaut .bashrc sur les systèmes ubuntu comprend les éléments suivants près du haut
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Cet appel cessera d'exécuter le reste du script et ne définira donc pas les chemins appropriés. Vous pouvez donc soit placer l'appel rvm en haut du fichier, soit supprimer l'appel de retour.
En fait, il y a totalement une autre option, plus sûre et plus légère.
, Vous devez ajouter "PermitUserEnvironment oui" quelque part à votre sshd_config dans /etc/(open)ssh
Maintenant, vous êtes autorisé à spécifier l'environnement de l'utilisateur dans /home/utilisateur/.ssh/environnement. Alors, que faites-vous y mettre ?
Juste quelque chose comme :
user# env | grep rvm > ~/.ssh/environment
Donc, il ressemble à ci-dessous:
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
Note: cela fonctionne également travail Utilisateur-installer RVM (pas seulement pour l'ensemble du système)
Maintenant votre sont capables d'utiliser ruby dans les sessions non interactives 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
Voilà!
"rvm" a deux bogues d'invocation: l'installation par défaut supprime le fichier /etc/profile.d/rvm.sh
et croit que toute astuce bash est maintenant disponible dans le monde entier. – Cette hypothèse est erronée.
Fichiers dans /etc/profile.d/
"source" sur la connexion, mais peut-être pas de bash, peut-être même pas à partir d'un shell. Donc, le crochet cd
qu'il installe n'est pas là après la sortie du shell qui exécute ces fichiers. En fait, à cause de la manière boguée "rvm" installe ce crochet, il est déjà parti une fois que vous exécutez naked bash
dans un login-shell!
Je ne sais pas si " rvm " supporte une invocation explicite pour les environnements virtuels, sans compter sur cd
ing dans un répertoire (que je considère comme le deuxième bug).
Il y a une solution de contournement saine:
Faites votre source shell /etc/profile.d/rvm.sh
à partir par exemple ~/.bashrc
. {[7] } est exécuté à partir de n'importe quel bash non-login, et login-bash est généralement configuré pour source .bashrc
à partir de ces fichiers login-shell comme ~/.profile
Pour votre problème ssh: un shell SSH approprié ne devrait-il pas être connexion-shell de toute façon?
Je viens d'ajouter en haut de~/.bashrc (pour l'utilisateur git) cette chaîne:
[[ -s "/usr/local/rvm/scripts/rvm" ]] && source "/usr/local/rvm/scripts/rvm"
Les solutions mentionnées fonctionnent certainement bien, mais la mienne devait fonctionner
source /usr/local/rvm/environments/<ruby version>@<gemset version>
Au début de l'appel SSH distant. Quelque chose comme:
ssh -l <remote username> <server ip> "source /usr/local/rvm/environments/<ruby version>@<gemset version> ; <rest of the remote script>"
(Si vous utilisez Capistrano) Ne pas Utiliser rvm1 / capistrano3 ou rvm / capistrano; ne pas définir :pty.
-
Changez
~/.rvmrc
pour l'utilisateur runner, sur le serveur, à ceci-notez qu'il doit venir avant la ligne où il se tue lorsqu'il ne s'exécute pas de manière interactive:
# 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
J'ai eu le même problème. J'ai réalisé, que j'ai accidentellement installé RVM pour plusieurs utilisateurs, aussi. Après avoir supprimé le répertoire / usr / local / rvm et modifier ~/.bashrc comme zoonmix l'a suggéré, le problème a été résolu.
Assurez-vous que sur le serveur, vous avez fait quelque chose comme rvm --default 1.9.2
pour définir Ruby de RVM comme la valeur par défaut. Sinon, il utilisera toujours le système par défaut Ruby.
Zoomix est la meilleure solution. Mais lorsque vous changez avec "Ruby RVM use system" dans le terminal ou quoi d'autre vous obtenez une erreur : Avertissement! Chemin n'est pas correctement mis en place, n'est pas à la première place.... Pour résoudre ce problème, mettez l'extrait juste avant le retour au lieu d'être en haut de la .fichier bashrc (Debian Jessie ici)
case $- in
*i*) ;;
*)
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
return;; esac