Oli*_*oyd 5 ssh child-process node.js
这适用于我的本地终端:
ssh -i ~/.ec2/mykey.pem ubuntu@ec2-yada-yada.amazonaws.com ls
Run Code Online (Sandbox Code Playgroud)
当然可以。但是,当我使用 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'
])
Run Code Online (Sandbox Code Playgroud)
结果:
stderr: Warning: Identity file /mykey.pem not accessible: No such file or directory.
stderr: Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud)
尝试的事情:
密钥路径的变化:(
/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) {...}
Run Code Online (Sandbox Code Playgroud)
尽管如此,我还是觉得我已经被降级了,从创建一个真正的奴隶使用fork它所有的好消息和方便的属性(我的原始实现在本地运行良好)到拥有吸尘器并被告知自己完成所有工作(现在我想在远程主机上启动奴隶)。
我最近似乎经常跳过布兰登的评论:-)。他又对了。执行时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 会为您完成所有这些工作,包括确定一个参数在哪里结束,另一个参数从哪里开始。
| 归档时间: |
|
| 查看次数: |
2419 次 |
| 最近记录: |