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

问题描述 投票:1回答:2

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

myscript文件:

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

在每个主机上本地运行时 - 例如myscript arg1 - 它成功运行。在群集中的“姐妹”节点上远程运行时(包含相同的文件和目录结构,包括nodeand 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似乎有点压倒性的尝试了几个答案,但没有成功:

  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
node.js openssh shebang
2个回答
1
投票

如果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"'

0
投票

塞巴斯蒂安的answer激励我找到一个解决方案,不会在脚本上硬编码node的完整路径。基本上,我确保在运行命令之前远程PATH可用:

ssh -o "PasswordAuthentication no" [email protected] "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?
© www.soinside.com 2019 - 2024. All rights reserved.