我试图通过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 in然后检查我在哪个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的行未针对非交互式会话执行.有两种方法可以解决这个问题:
>在初始化文件中找到将/home/user/.nvm/v0.10.00/bin添加到命令路径的命令,找出它为非交互式会话运行的原因,并进行更正.>使用-t选项运行ssh.这告诉它为远程会话分配PTY.或者将RequestTTY行添加到本地主机上的.ssh / config文件中.