Class: Net::SSH::Authentication::Methods::KeyboardInteractive
- Defined in:
- lib/net/ssh/authentication/methods/keyboard_interactive.rb
Overview
Implements the “keyboard-interactive” SSH authentication method.
Constant Summary collapse
- USERAUTH_INFO_REQUEST =
60
- USERAUTH_INFO_RESPONSE =
61
Constants included from Constants
Constants::USERAUTH_BANNER, Constants::USERAUTH_FAILURE, Constants::USERAUTH_METHOD_RANGE, Constants::USERAUTH_PASSWD_CHANGEREQ, Constants::USERAUTH_PK_OK, Constants::USERAUTH_REQUEST, Constants::USERAUTH_SUCCESS
Instance Attribute Summary
Attributes inherited from Abstract
#key_manager, #pubkey_algorithms, #session
Attributes included from Loggable
Instance Method Summary collapse
-
#authenticate(next_service, username, password = nil) ⇒ Object
Attempt to authenticate the given user for the given service.
- #interactive? ⇒ Boolean
Methods inherited from Abstract
#initialize, #send_message, #session_id, #userauth_request
Methods included from Loggable
#debug, #error, #fatal, #info, #lwarn
Constructor Details
This class inherits a constructor from Net::SSH::Authentication::Methods::Abstract
Instance Method Details
#authenticate(next_service, username, password = nil) ⇒ Object
Attempt to authenticate the given user for the given service.
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/net/ssh/authentication/methods/keyboard_interactive.rb', line 14 def authenticate(next_service, username, password = nil) debug { "trying keyboard-interactive" } (userauth_request(username, next_service, "keyboard-interactive", "", "")) prompter = nil loop do = session. case .type when USERAUTH_SUCCESS debug { "keyboard-interactive succeeded" } prompter.success if prompter return true when USERAUTH_FAILURE debug { "keyboard-interactive failed" } raise Net::SSH::Authentication::DisallowedMethod unless [:authentications].split(/,/).include? 'keyboard-interactive' return false unless interactive? password = nil debug { "retrying keyboard-interactive" } (userauth_request(username, next_service, "keyboard-interactive", "", "")) when USERAUTH_INFO_REQUEST name = .read_string instruction = .read_string debug { "keyboard-interactive info request" } if password.nil? && interactive? && prompter.nil? prompter = prompt.start(type: 'keyboard-interactive', name: name, instruction: instruction) end _ = .read_string # lang_tag responses = [] .read_long.times do text = .read_string echo = .read_bool password_to_send = password || (prompter && prompter.ask(text, echo)) responses << password_to_send end # if the password failed the first time around, don't try # and use it on subsequent requests. password = nil msg = Buffer.from(:byte, USERAUTH_INFO_RESPONSE, :long, responses.length, :string, responses) (msg) else raise Net::SSH::Exception, "unexpected reply in keyboard interactive: #{.type} (#{.inspect})" end end end |
#interactive? ⇒ Boolean
69 70 71 72 |
# File 'lib/net/ssh/authentication/methods/keyboard_interactive.rb', line 69 def interactive? = session.transport. || {} ![:non_interactive] end |