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