node.js 无法通过 ssh

node.js unavailable via ssh

我正在尝试通过 SSH 在远程服务器 运行 Ubuntu 上调用 node.js 的安装。节点已通过 nvm 安装。

通过 SSH 连接并调用节点工作正常:

user@localmachine:~$ ssh user@remoteserver
(Server welcome text)
user@remoteserver:~$ which node
/home/user/.nvm/v0.10.00/bin/node

但是如果我把它合并成一行:

user@localmachine:~$ ssh user@remoteserver "which ls"
/bin/ls
user@localmachine:~$ ssh user@remoteserver "which node"

没有节点的迹象,所以我尝试采购 .bashrc 并等待 10 秒:

user@localmachine:~$ ssh user@remoteserver "source ~/.bashrc; sleep 10; which node"

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

user@localmachine:~$ ssh user@remoteserver 'bash --login -c "which node"'

仍然没有。

基本上我的问题是:当我从 SSH 以非交互方式调用它时,为什么 bash 找不到我的 node.js 安装?

$ ssh user@remoteserver "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 添加到您的命令路径的命令,弄清楚为什么它不是 运行ning 用于非交互式会话,以及更正一下。

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

另一种方法是 运行 bash 在交互模式下使用 -i 标志:

user@localmachine:~$ ssh user@remoteserver "bash -i -c 'which node'"
/home/user/.nvm/v0.10.00/bin/node