我想通过shebang line远程运行包含ssh
的node.js脚本,就像在本地运行它一样。
myscript
文件:
#!/usr/bin/env node
var param = process.argv[2] || 'help';
//... other js code
在每个主机上本地运行时 - 例如myscript arg1
- 它成功运行。在群集中的“姐妹”节点上远程运行时(包含相同的文件和目录结构,包括node
and myscript
):
ssh -o "PasswordAuthentication no" [email protected] /path/to/myscript arg1
我得到/usr/bin/env: ‘node’: No such file or directory
错误。
我错过了ssh
param / option吗?
模式细节:如果我跑
ssh -o "PasswordAuthentication no" [email protected] echo "hello"
它也工作正常。请原谅我这对你来说很明显,我不是一个高级的Linux用户,ssh manual似乎有点压倒性的尝试了几个答案,但没有成功:
如果node
可执行文件在登录时不在您的PATH
环境变量中,您可以在脚本的shebang行中提供它的完整路径:
#!/usr/bin/env /full/path/to/node
正如其他人所评论的那样,如果node
的路径发生变化,则必须更新脚本。这不太理想。或者,您可以通过指定ssh
标志并在交互式bash shell中运行脚本来强制-t
创建伪终端会话:
ssh -t -o "PasswordAuthentication no" [email protected] 'bash -ic "/path/to/myscript arg1"'
塞巴斯蒂安的answer激励我找到一个解决方案,不会在脚本上硬编码node
的完整路径。基本上,我确保在运行命令之前远程PATH
可用:
ssh -o "PasswordAuthentication no" [email protected] "export PATH=$PATH;/path/to/myscript arg1"
但这只对我有用,因为本地和远程服务器具有相同的PATH
值,因为本地PATH
被设置到远程会话。
如果您的案例不像我的那样,可能有一些方法可以探索其他解决方案: