这适用于我的本地终端:
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).
尝试的事情:
密钥路径的变化:(
/actual/path/to/mykey.pem
mykey.pem
在节点项目的根目录中包含
/mykey.pem
文件的副本)(在节点项目的根目录中包含文件的副本)
~/.ec2.mykey.pem
(应该在哪里)运行没有 ssh 部分的命令,即。
childProcess(ls);
- 作品。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
所有漂亮的消息传递和方便的属性(我最初的实现在本地运行良好)创建一个真正的奴隶降级到拥有一个真空吸尘器并被告知自己完成所有工作(现在我想在远程主机上启动奴隶)。