如何使用ssh远程运行(带有shebang前缀的)节点脚本?

时间:2019-03-26 18:51:58

标签: node.js openssh shebang

我想远程运行包含shebang linessh的node.js脚本,就像在本地运行它一样。

myscript文件:

#!/usr/bin/env node
var param  = process.argv[2] || 'help';
//... other js code

在每台主机上本地运行时-例如myscript arg1 –成功运行。在群集(包含相同的文件和目录结构,包括nodemyscript的群集中的“姐妹”节点上远程运行时:

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似乎有点不知所措,并尝试了一些没有成功的答案:

  1. What exactly does "/usr/bin/env node" do at the beginning of node files?
  2. Run scripts remotely via SSH
  3. how to run a script file remotely using ssh

2 个答案:

答案 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设置为远程会话。


如果您的情况不像我的情况,这里可能有一些探索其他解决方案的方法:

  1. How do I set $PATH such that `ssh user@host command` works?
  2. How to set PATH when running a ssh command?