2015-04-30 104 views
6

我试图打电话的node.js的安装通过SSH运行Ubuntu的远程服务器上不可用。节点已经通过nvm安装。的Node.js通过ssh

ssh方式连接的,并呼吁节点工作得很好:

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

但是如果我合并成一条线:

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

节点的迹象,所以我想采购的.bashrc并等待10秒:

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

只有节点似乎受此影响。我注意到的一件事是,如果我ssh在,然后检查我在其中的shell说-bash,而如果我ssh直接它给了我/bin/bash。我试图运行一个bash登录shell中的命令:

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

仍然一无所获。

基本上我的问题是:为什么不是来砸找到我的node.js安装时,我把它称为非交互的SSH?

回答

3
$ ssh [email protected] "which node" 

当您运行ssh并指定命令要在远程系统上运行,SSH默认情况下不分配会话的PTY(伪TTY)。没有TTY会导致远程shell进程(即bash)初始化为非交互式会话而不是交互式会话。这可以改变它如何解释你的初始化文件--bashrc,.bash_profile等等。

实际的问题是,可能是它增加了/home/user/.nvm/v0.10.00/bin到命令PATH行未对非交互式会话中执行。有两种方法可以解决此问题:

  1. 查找它增加了/home/user/.nvm/v0.10.00/bin到命令路径初始化文件(S)的命令,弄清楚为什么它不适合非交互式会话中运行,并纠正它。

  2. -t选项运行ssh。这告诉它为远程会话分配一个PTY。或者将RequestTTY yes行添加到本地主机上的.ssh/config文件中。

+0

我已经运行它的ssh -t用户@ REMOTESERVER“的节点”,但它仍然不找到它。向.ssh/config文件添加RequestTTY似乎也没有效果。 – TDN169

+0

我也试过ssh -t user @ remoteserver“bash --rcfile〜/ .bashrc -c'哪个节点'”似乎没有效果。 – TDN169

+1

我刚刚尝试过: ssh -t user @ remoteserver'export NVM_DIR =“/ home/user/.nvm”; [-s“$ NVM_DIR/nvm.sh”] &&。 “$ NVM_DIR/nvm.sh”;哪个节点“,这是工作! – TDN169