Как проверить SSH соединение с использованием Ruby

Это то, что я получил до сих пор. Это прекрасно работает, проблема в том, что я не могу ввести пароль для входа в систему 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 ​​без установки каких-либо "внешних" гемов.

2 ответа

Решение

Посмотрев немного в Stackru, я нашел эту ветку и смог решить мою проблему, выполнив следующее:

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-соединения в ruby.

Я считаю, что вы не можете сделать это с ssh сам, но вот что sshpass это, как вы можете прочитать в этом ответе сервера. В 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
Другие вопросы по тегам