2011-08-02 25 views
5

我读过的净SSH的文档,我仍然感到困惑。我可以手动进行身份验证(使用ssh -i ...),也可以将密钥放在文件中并使用:keys参数。但是,我不想使用:keys参数,我想使用:key_data参数。任何人都可以举个实例吗?出于某种原因,直接将一个字符串提供给:key_data不起作用,并且出现错误:“既没有PUB键也没有PRIV键::嵌套asn1错误”。当然我用Google搜索了一下,它基本上告诉我要确保密钥是PEM格式。而且,当然是。有任何想法吗?如果需要,我可以提供更详细的信息...使用Ruby和净-SSH,我怎么使用身份验证与净:: SSH.start的key_data参数?

回答

9

我看到这个问题在很老,但我要去反正答案扔给你以防万一,因为我有同样的问题,我只是解决了它。

在下面的代码请注意,包含RSA密钥字符串不是缩进在所有的任何地方。密钥的第二行没有任何前导空间。 TextMate把它放在那里,当我把钥匙粘贴进去时,我把它移开了,它像一个魅力一样工作。

#!/usr/bin/env ruby 
require 'rubygems' 
require 'net/ssh' 

HOST = '172.20.0.31' 
USER = 'root' 

KEYS = [ "-----BEGIN RSA PRIVATE KEY----- 
MIIEogIBAAKCAQEAqccvUza8FCinI4X8HSiXwIqQN6TGvcNBJnjPqGJxlstq1IfU 
kFa3S9eJl+CBkyjfvJ5ggdLN0S2EuGWwc/bdE3LKOWX8F15tFP0= 
-----END RSA PRIVATE KEY-----" ] 

Net::SSH.start(HOST, USER, :key_data => KEYS, :keys_only => TRUE) do|ssh| 
result = ssh.exec!('ls') 
puts result 
end 
+0

越来越'/usr/share/ruby/2.0/socket.rb:232:in:

使用上面的例子,在2.9.2,你可以做这样的事情得到相同的效果'getaddrinfo':没有将数组隐式转换为String(TypeError)' – sixty4bit

6

我加入,我在图书馆周围挖后发现自己一点点的详细信息...

自2.9.2,如果你的目的是使用只在key_data提供的钥匙,你在加载key_data之前还必须指定一组空白键,否则它将加载一些默认键。

在我的情况下,它试图加载的身份文件之一是密码保护,所以它要求我输入密码,尽管我的意图是根本不使用该识别文件。

#!/usr/bin/env ruby 
require 'rubygems' 
require 'net/ssh' 

HOST = '172.20.0.31' 
USER = 'root' 

KEYS = [ "-----BEGIN RSA PRIVATE KEY----- 
MIIEogIBAAKCAQEAqccvUza8FCinI4X8HSiXwIqQN6TGvcNBJnjPqGJxlstq1IfU 
kFa3S9eJl+CBkyjfvJ5ggdLN0S2EuGWwc/bdE3LKOWX8F15tFP0= 
-----END RSA PRIVATE KEY-----" ] 

Net::SSH.start(HOST, USER, :keys => [], :key_data => KEYS, :keys_only => TRUE) do|ssh| 
result = ssh.exec!('ls') 
puts result 
end