Как проверить 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