2015-02-11 232 views
1

这是我到目前为止所做的。这个伟大的工程,这个问题是我不能输入的ssh登录密码,我需要以具有共享SSH密钥这个工作:如何使用Ruby测试SSH连接

def ssh_conn(user, host, &block) 
    begin 
     ping_output = [] 
     timeout(20) do 
     ping_output = IO.popen("ssh #{user}@#{host} 'echo \"success\"'", "w+") 
     end 
    ping = ping_output.readlines.join[/success/] ? true : false 
    rescue Timeout::Error 
     ping = false 
    rescue 
     ping = false 
    end 
    ping_output.close 
    if block_given? && ping 
    yield 
    end 
    return ping 
end 

这里的问题是:我怎么能做些什么与此类似,但通过传递给方法的参数输入密码?最好使用Ruby本地类/方法而不安装任何“外部”宝石。

回答

2

通过搜索位的StackOverflow我发现this thread ,我能解决我的问题这样做:

def ssh_try(user, host, pass) 
    puts "SSHing #{host} ..." 
    Net::SSH.start(host.to_s, user.to_s, :password => pass.to_s) do |ssh| 
    puts ssh.exec!('date') 
    puts "Logging out..." 
    end 
end 

任何人谁是面临着类似的问题可以尝试这种方法,很好地测试/使用红宝石ssh连接。

+0

你快!好吧,很高兴帮助;) – dgilperez 2015-02-11 14:58:15

+0

@dgilperez非常感谢您的时间和帮助:) – skimisha 2015-02-11 15:05:45

+0

也解决了我的问题,非常感谢 – Deano 2016-03-27 13:31:20

1

我相信你不能这样做ssh本身,但这就是sshpass这是因为你可以在这个serverfault answer阅读。在Ubuntu中:

$ sudo apt-get install sshpass 

,然后改变你的IO电话这样的:

ping_output = IO.popen("sshpass -p ssh #{user}@#{host} 'echo \"success\"'", "w+") 

另一种方法是重写代码使用Ruby SSH客户端,如net-ssh,而不是使用系统命令。这实际上是我的建议,因为它可以让你在更高的抽象级别工作,而不是处理系统问题。而且,结果看起来更漂亮!检查这个(未经测试)代码:

require 'net/ssh' 
def ssh_conn(user, host, password, &block) 
    authentication_successful = Net::SSH::Authentication::Session.authenticate(host, user, password) 

    authentication_successful && (yield if block_given?) 
    authentication_successful 
end 
+0

是的,我已经听说过sshpass,我已经尝试过了,它效果很好。 sshpass的问题是我没有被允许安装任何东西,并避免使用ruby宝石(公司政策,不要问 - )。难道你不知道还有其他的方法吗?也许在Ruby中实现期望/发送,类似于'expect“密码:”;发送“”' – skimisha 2015-02-11 14:09:16