2015-02-11 5 views
1

Это то, что я получил до сих пор. Это прекрасно работает, то проблема в том, я не могу ввести пароль для входа в SSH, мне нужно иметь общие ключи SSH для того, чтобы это работало:Как проверить соединение SSH с помощью Ruby

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 

вопрос здесь: Как я могу сделать что-то аналогично этому, но с вводом пароля через аргументы, переданные методу? Предпочтительно использовать рубиновые классы/методы без установки каких-либо «внешних» драгоценных камней.

ответ

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

+0

Вы были быстрее! Хорошо, рад помочь;) – dgilperez

+0

@dgilperez большое спасибо за ваше время и помощь :) – skimisha

+0

решил мою проблему тоже, спасибо большое – Deano

1

Я считаю, что вы не можете сделать это с помощью ssh, но это то, что sshpass это для, как вы можете прочитать в этом serverfault answer. В Ubuntu:

$ sudo apt-get install sshpass 

, а затем измените IO вызов, как это:

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

В качестве альтернативы можно переписать код, чтобы использовать рубин 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, что-то вроде 'expect 'Password:"; Отправить "" ' – skimisha

Смежные вопросы