1

这是我到目前为止得到的。这很好用,问题是我无法输入 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_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​​ 原生类/方法而不安装任何“外部”gem。

4

2 回答 2

2

通过在 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 连接。

于 2015-02-11T14:49:34.420 回答
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
于 2015-02-11T13:00:08.360 回答