【问题标题】:How to pass a key file when spawning an ssh command from node.js?从 node.js 生成 ssh 命令时如何传递密钥文件?
【发布时间】:2012-09-02 05:17:45
【问题描述】:

这适用于我的本地终端:

ssh -i ~/.ec2/mykey.pem ubuntu@ec2-yada-yada.amazonaws.com ls

当然可以。但是,当我使用 node.js 的 child_process.spawn 命令尝试相同的操作时,它会抱怨密钥不存在/无法访问。

// child process
var childProcess = require('child_process').spawn;

// spawn the slave using slaveId as the key
slaves[slaveId] = childProcess('ssh', [
    '-i /mykey.pem',
    'ubuntu@ec2-yada.amazonaws.com',
    'ls'
])  

结果:

stderr: Warning: Identity file  /mykey.pem not accessible: No such file or directory.  
stderr: Permission denied (publickey).

尝试过的事情:

  1. 密钥路径的变化:
    /actual/path/to/mykey.pem
    mykey.pem(带有节点项目根目录中的文件副本)
    /mykey.pem(带有副本节点项目根目录中的文件)
    ~/.ec2.mykey.pem(应该在哪里)

  2. 在没有 ssh 部分的情况下运行命令,即。 childProcess(ls); - 有效。

  3. chmod 644, 600, 400 etc. mykey.pem

此时我唯一的理论是传入文件引用存在问题,我需要使用 fs 模块做 一些事情。 (?) 是的,我知道有一些库可以通过 node 进行 ssh 访问,但它们使用的密码不会削减它,而且无论如何,我的要求并不能证明库的合理性。

请告诉我我很愚蠢,这是可能的。

更新:

好的,所以我可以像这样使用 exec 命令:

var childProcess = require('child_process').exec;
slaves[slaveId] = childProcess('ssh -i mykey.pem ubuntu@ec2-yada.amazonaws.com ls',  function (error, stdout, stderr) {...}

不过,我觉得我已经从使用 fork 创建一个真正的奴隶降级了我自己的工作(现在我想在远程主机上启动从属)。

【问题讨论】:

  • 如果生成时将'-i /mykey.pem' 拆分为两个元素:'-i', '/mykey.pem'
  • 如果我把它分成两个元素,那么它就可以工作。这是使 spawn 工作的解决方案。

标签: node.js ssh child-process


【解决方案1】:

我最近似乎经常跳 Brandon 的 cmets :-)。他又是对的。当您执行ssh -i ~/.ec2/mykey.pem ubuntu@ec2-yada-yada.amazonaws.com ls 时,ssh 可执行文件在这种情况下会获取四个参数:-i、密钥文件的名称、主机地址和命令,例如。 ls -ltr /tmp。当它看到 -i 时,它希望 next 参数是密钥文件的名称,而不是将名称视为 -i 的尾随子字符串。

请记住,当您spawn 一个程序时,您直接调用它而无需通过 shell,因此您必须准确地将 shell 传递给它的参数传递给它 shell 执行任何操作之后扩展、引用等。当您使用exec 时,实际上是在将命令行字符串传递给shell,因此shell 会为您完成所有这些工作,包括确定一个参数在哪里结束,另一个参数从哪里开始。

【讨论】:

  • 谢谢,奇怪的是它接受诸如ls -ltr /tmp 之类的命令作为一个参数,但-i myfile.pem 需要分解为两个。 Pff,但它现在可以工作,如前所述。
猜你喜欢
  • 2021-01-20
  • 2019-06-11
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2013-03-17
  • 1970-01-01
相关资源
最近更新 更多