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
21
demandé sur the Tin Man 2011-08-03 00:58:13

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.

19
répondu Michael Kohl 2011-08-07 17:20:39

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.

49
répondu zoomix 2011-08-23 09:30:59

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à!

16
répondu wojciechz 2013-01-10 12:41:49

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

3
répondu Robert Siemer 2015-02-10 14:23:41

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"
2
répondu demofly 2014-12-28 23:00:04

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>"
1
répondu plang 2013-02-21 17:04:48
  1. (Si vous utilisez Capistrano) Ne pas Utiliser rvm1 / capistrano3 ou rvm / capistrano; ne pas définir :pty.

  2. 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 
1
répondu Sai 2014-03-12 20:07:16

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.

1
répondu Christian 2014-07-15 16:55:38

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.

0
répondu Dylan Markow 2011-08-02 21:03:07

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
0
répondu Couru d'avance 2017-03-30 17:50:32