【发布时间】: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).
尝试过的事情:
密钥路径的变化:
/actual/path/to/mykey.pemmykey.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 创建一个真正的奴隶降级了我自己的工作(现在我想在远程主机上启动从属)。
【问题讨论】:
-
如果生成时将
'-i /mykey.pem'拆分为两个元素:'-i', '/mykey.pem'? -
如果我把它分成两个元素,那么它就可以工作。这是使 spawn 工作的解决方案。
标签: node.js ssh child-process