5

这适用于我的本地终端:

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所有漂亮的消息传递和方便的属性(我最初的实现在本地运行良好)创建一个真正的奴隶降级到拥有一个真空吸尘器并被告知自己完成所有工作(现在我想在远程主机上启动奴隶)。

4

1 回答 1

6

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

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

于 2012-09-09T03:45:44.257 回答