如何使用Ruby测试SSH连接
这就是我目前得到的。这很好,问题是我无法为ssh登录输入密码,我需要共享ssh密钥才能工作:如何使用Ruby测试SSH连接,ruby,ssh,ruby-2.2,Ruby,Ssh,Ruby 2.2,这就是我目前得到的。这很好,问题是我无法为ssh登录输入密码,我需要共享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
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
这里的问题是:如何做类似的事情,但通过传递给方法的参数输入密码?最好在不安装任何“外部”gems的情况下使用ruby本机类/方法。我相信您不能用
ssh
本身来实现这一点,但这正是sshpass
的目的,正如您在本文中所读到的那样。在Ubuntu中:
$ sudo apt-get install sshpass
然后像这样更改IO
呼叫:
ping_output = IO.popen("sshpass -p ssh #{user}@#{host} 'echo \"success\"'", "w+")
另一种方法是重写代码以使用Ruby SSH客户端,例如,而不是使用system命令。这实际上是我的建议,因为它允许您在更高的抽象级别上工作,而不是处理系统问题。而且,结果看起来更漂亮!检查此(未测试)代码:
通过在StackOverflow中搜索,我发现 通过这样做,我能够解决我的问题:
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
任何面临类似问题的人都可以尝试这种方法,在ruby中测试/使用ssh连接非常有效。是的,我已经听说过sshpass,我已经尝试过了,效果非常好。sshpass的问题是我不允许安装任何东西,并且避免使用ruby gems(公司政策,不问-。-)。你不知道还有别的办法吗?可能在ruby中实现一个expect/send,类似于
expect“Password:”;发送“”
你更快了!嗯,很乐意帮忙;)
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