2015-04-30 1 views
6

J'essaye d'appeler une installation de node.js sur un serveur distant exécutant Ubuntu via SSH. Le noeud a été installé via nvm.node.js indisponible via ssh

et l'exécution de ssh nœud appelant fonctionne très bien:

[email protected]:~$ ssh [email protected] 
(Server welcome text) 
[email protected]:~$ which node 
/home/user/.nvm/v0.10.00/bin/node 

Toutefois, si je le combine en une seule ligne:

[email protected]:~$ ssh [email protected] "which ls" 
/bin/ls 
[email protected]:~$ ssh [email protected] "which node" 

Aucun signe de noeud, alors j'ai essayé approvisionnement .bashrc et attendre 10 secondes:

[email protected]:~$ ssh [email protected] "source ~/.bashrc; sleep 10; which node" 

Seul le nœud semble affecté par ceci. Une chose que j'ai remarquée, c'est que si je ssh et que je vérifie la coque dans laquelle je suis, elle dit -bash alors que si je la ssh directe, elle me donne /bin/bash. J'ai essayé d'exécuter les commandes à l'intérieur d'un shell de connexion bash:

[email protected]:~$ ssh [email protected] 'bash --login -c "which node"' 

Toujours rien.

Fondamentalement, ma question est: Pourquoi bash ne trouve-t-il pas mon installation de node.js quand je l'appelle de manière non interactive depuis SSH?

Répondre

3
$ ssh [email protected] "which node" 

Lorsque vous exécutez ssh et spécifiez une commande à exécuter sur le système distant, ssh par défaut n'alloue pas PTY (pseudo-TTY) pour la session. Le fait de ne pas avoir de TTY entraîne l'initialisation de votre processus shell distant (c'est-à-dire, bash) en tant que session non interactive au lieu d'une session interactive. Cela peut modifier la manière dont il interprète vos fichiers d'initialisation: .bashrc, .bash_profile, etc.

Le problème réel est probablement que la ligne qui ajoute /home/user/.nvm/v0.10.00/bin à votre commande PATH n'est pas en cours d'exécution pour les sessions non interactives. Il y a deux façons de résoudre ce:

  1. Trouver la commande dans votre fichier d'initialisation (s) qui ajoute /home/user/.nvm/v0.10.00/bin à votre chemin de commande, de savoir pourquoi il ne court pas pour les sessions non-interactives et la corriger.

  2. Exécutez ssh avec l'option -t. Cela lui indique d'allouer un PTY pour la session à distance. Ou ajoutez la ligne RequestTTY yes à votre fichier .ssh/config sur l'hôte local.

+0

J'ai couru comme @ ssh utilisateur -t remoteserver « qui noeud », mais cela ne fonctionne toujours pas trouve le. L'ajout de RequestTTY au fichier .ssh/config semble n'avoir aucun effet non plus. – TDN169

+0

J'ai aussi essayé ssh -t utilisateur @ remoteserver "bash --rcfile ~/.bashrc -c 'quel noeud' 'qui ne semble pas avoir d'effet. – TDN169

+1

Je viens d'essayer: ssh -t utilisateur @ remoteserver 'export NVM_DIR = "/ home/user/.nvm"; [-s "$ NVM_DIR/nvm.sh"] &&. "$ NVM_DIR/nvm.sh"; quel noeud 'et ça marche! – TDN169