net-ssh 2.7.0 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/.dockerignore +6 -0
- data/.github/FUNDING.yml +1 -0
- data/.github/config/rubocop_linter_action.yml +4 -0
- data/.github/workflows/ci-with-docker.yml +44 -0
- data/.github/workflows/ci.yml +94 -0
- data/.github/workflows/rubocop.yml +16 -0
- data/.gitignore +15 -0
- data/.rubocop.yml +22 -0
- data/.rubocop_todo.yml +1081 -0
- data/CHANGES.txt +387 -0
- data/DEVELOPMENT.md +23 -0
- data/Dockerfile +29 -0
- data/Dockerfile.openssl3 +17 -0
- data/Gemfile +13 -0
- data/Gemfile.noed25519 +12 -0
- data/Gemfile.norbnacl +12 -0
- data/ISSUE_TEMPLATE.md +30 -0
- data/Manifest +4 -5
- data/README.md +303 -0
- data/Rakefile +174 -40
- data/SECURITY.md +4 -0
- data/THANKS.txt +25 -0
- data/appveyor.yml +58 -0
- data/docker-compose.yml +25 -0
- data/lib/net/ssh/authentication/agent.rb +279 -18
- data/lib/net/ssh/authentication/certificate.rb +183 -0
- data/lib/net/ssh/authentication/constants.rb +17 -15
- data/lib/net/ssh/authentication/ed25519.rb +184 -0
- data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
- data/lib/net/ssh/authentication/key_manager.rb +125 -54
- data/lib/net/ssh/authentication/methods/abstract.rb +67 -48
- data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +19 -12
- data/lib/net/ssh/authentication/methods/none.rb +16 -19
- data/lib/net/ssh/authentication/methods/password.rb +56 -19
- data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
- data/lib/net/ssh/authentication/pageant.rb +483 -246
- data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
- data/lib/net/ssh/authentication/session.rb +138 -120
- data/lib/net/ssh/buffer.rb +399 -300
- data/lib/net/ssh/buffered_io.rb +154 -150
- data/lib/net/ssh/config.rb +361 -166
- data/lib/net/ssh/connection/channel.rb +640 -596
- data/lib/net/ssh/connection/constants.rb +29 -29
- data/lib/net/ssh/connection/event_loop.rb +123 -0
- data/lib/net/ssh/connection/keepalive.rb +59 -0
- data/lib/net/ssh/connection/session.rb +628 -548
- data/lib/net/ssh/connection/term.rb +125 -123
- data/lib/net/ssh/errors.rb +101 -95
- data/lib/net/ssh/key_factory.rb +198 -100
- data/lib/net/ssh/known_hosts.rb +221 -98
- data/lib/net/ssh/loggable.rb +50 -49
- data/lib/net/ssh/packet.rb +83 -79
- data/lib/net/ssh/prompt.rb +50 -81
- data/lib/net/ssh/proxy/command.rb +108 -60
- data/lib/net/ssh/proxy/errors.rb +12 -10
- data/lib/net/ssh/proxy/http.rb +82 -78
- data/lib/net/ssh/proxy/https.rb +50 -0
- data/lib/net/ssh/proxy/jump.rb +54 -0
- data/lib/net/ssh/proxy/socks4.rb +5 -8
- data/lib/net/ssh/proxy/socks5.rb +18 -20
- data/lib/net/ssh/service/forward.rb +383 -255
- data/lib/net/ssh/test/channel.rb +145 -136
- data/lib/net/ssh/test/extensions.rb +131 -110
- data/lib/net/ssh/test/kex.rb +34 -32
- data/lib/net/ssh/test/local_packet.rb +46 -44
- data/lib/net/ssh/test/packet.rb +89 -70
- data/lib/net/ssh/test/remote_packet.rb +32 -30
- data/lib/net/ssh/test/script.rb +156 -142
- data/lib/net/ssh/test/socket.rb +49 -48
- data/lib/net/ssh/test.rb +82 -77
- data/lib/net/ssh/transport/aes128_gcm.rb +40 -0
- data/lib/net/ssh/transport/aes256_gcm.rb +40 -0
- data/lib/net/ssh/transport/algorithms.rb +472 -348
- data/lib/net/ssh/transport/chacha20_poly1305_cipher.rb +117 -0
- data/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb +17 -0
- data/lib/net/ssh/transport/cipher_factory.rb +124 -100
- data/lib/net/ssh/transport/constants.rb +32 -24
- data/lib/net/ssh/transport/ctr.rb +42 -22
- data/lib/net/ssh/transport/gcm_cipher.rb +207 -0
- data/lib/net/ssh/transport/hmac/abstract.rb +97 -63
- data/lib/net/ssh/transport/hmac/md5.rb +0 -2
- data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
- data/lib/net/ssh/transport/hmac/none.rb +0 -2
- data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
- data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
- data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac.rb +14 -12
- data/lib/net/ssh/transport/identity_cipher.rb +54 -44
- data/lib/net/ssh/transport/kex/abstract.rb +130 -0
- data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +119 -213
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -61
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
- data/lib/net/ssh/transport/kex.rb +15 -12
- data/lib/net/ssh/transport/key_expander.rb +24 -20
- data/lib/net/ssh/transport/openssl.rb +161 -124
- data/lib/net/ssh/transport/openssl_cipher_extensions.rb +8 -0
- data/lib/net/ssh/transport/packet_stream.rb +246 -183
- data/lib/net/ssh/transport/server_version.rb +57 -51
- data/lib/net/ssh/transport/session.rb +307 -235
- data/lib/net/ssh/transport/state.rb +178 -176
- data/lib/net/ssh/verifiers/accept_new.rb +33 -0
- data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
- data/lib/net/ssh/verifiers/always.rb +58 -0
- data/lib/net/ssh/verifiers/never.rb +19 -0
- data/lib/net/ssh/version.rb +57 -51
- data/lib/net/ssh.rb +140 -40
- data/net-ssh-public_cert.pem +21 -0
- data/net-ssh.gemspec +39 -184
- data/support/ssh_tunnel_bug.rb +5 -5
- data.tar.gz.sig +0 -0
- metadata +205 -99
- metadata.gz.sig +0 -0
- data/README.rdoc +0 -219
- data/Rudyfile +0 -96
- data/gem-public_cert.pem +0 -20
- data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
- data/lib/net/ssh/authentication/agent/socket.rb +0 -170
- data/lib/net/ssh/ruby_compat.rb +0 -51
- data/lib/net/ssh/verifiers/lenient.rb +0 -30
- data/lib/net/ssh/verifiers/null.rb +0 -12
- data/lib/net/ssh/verifiers/secure.rb +0 -54
- data/lib/net/ssh/verifiers/strict.rb +0 -24
- data/setup.rb +0 -1585
- data/support/arcfour_check.rb +0 -20
- data/test/README.txt +0 -47
- data/test/authentication/methods/common.rb +0 -28
- data/test/authentication/methods/test_abstract.rb +0 -51
- data/test/authentication/methods/test_hostbased.rb +0 -114
- data/test/authentication/methods/test_keyboard_interactive.rb +0 -100
- data/test/authentication/methods/test_none.rb +0 -41
- data/test/authentication/methods/test_password.rb +0 -52
- data/test/authentication/methods/test_publickey.rb +0 -148
- data/test/authentication/test_agent.rb +0 -205
- data/test/authentication/test_key_manager.rb +0 -218
- data/test/authentication/test_session.rb +0 -108
- data/test/common.rb +0 -108
- data/test/configs/eqsign +0 -3
- data/test/configs/exact_match +0 -8
- data/test/configs/host_plus +0 -10
- data/test/configs/multihost +0 -4
- data/test/configs/nohost +0 -19
- data/test/configs/numeric_host +0 -4
- data/test/configs/send_env +0 -2
- data/test/configs/substitutes +0 -8
- data/test/configs/wild_cards +0 -14
- data/test/connection/test_channel.rb +0 -467
- data/test/connection/test_session.rb +0 -526
- data/test/known_hosts/github +0 -1
- data/test/manual/test_forward.rb +0 -223
- data/test/start/test_options.rb +0 -36
- data/test/start/test_transport.rb +0 -28
- data/test/test_all.rb +0 -11
- data/test/test_buffer.rb +0 -433
- data/test/test_buffered_io.rb +0 -63
- data/test/test_config.rb +0 -151
- data/test/test_key_factory.rb +0 -173
- data/test/test_known_hosts.rb +0 -13
- data/test/transport/hmac/test_md5.rb +0 -41
- data/test/transport/hmac/test_md5_96.rb +0 -27
- data/test/transport/hmac/test_none.rb +0 -34
- data/test/transport/hmac/test_ripemd160.rb +0 -36
- data/test/transport/hmac/test_sha1.rb +0 -36
- data/test/transport/hmac/test_sha1_96.rb +0 -27
- data/test/transport/hmac/test_sha2_256.rb +0 -37
- data/test/transport/hmac/test_sha2_256_96.rb +0 -27
- data/test/transport/hmac/test_sha2_512.rb +0 -37
- data/test/transport/hmac/test_sha2_512_96.rb +0 -27
- data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
- data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -146
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -92
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -34
- data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
- data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
- data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
- data/test/transport/test_algorithms.rb +0 -330
- data/test/transport/test_cipher_factory.rb +0 -443
- data/test/transport/test_hmac.rb +0 -34
- data/test/transport/test_identity_cipher.rb +0 -40
- data/test/transport/test_packet_stream.rb +0 -1755
- data/test/transport/test_server_version.rb +0 -78
- data/test/transport/test_session.rb +0 -319
- data/test/transport/test_state.rb +0 -181
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
|
3
|
+
module Net
|
4
|
+
module SSH
|
5
|
+
module Authentication
|
6
|
+
# Public key fingerprinting utility module - internal not part of API.
|
7
|
+
# This is included in pubkey classes and called from there. All RSA, DSA, and ECC keys
|
8
|
+
# are supported.
|
9
|
+
#
|
10
|
+
# require 'net/ssh'
|
11
|
+
# my_pubkey_text = File.read('/path/to/id_ed25519.pub')
|
12
|
+
# #=> "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDB2NBh4GJPPUN1kXPMu8b633Xcv55WoKC3OkBjFAbzJ alice@example.com"
|
13
|
+
# my_pubkey = Net::SSH::KeyFactory.load_data_public_key(my_pubkey_text)
|
14
|
+
# #=> #<Net::SSH::Authentication::ED25519::PubKey:0x00007fc8e91819b0
|
15
|
+
# my_pubkey.fingerprint
|
16
|
+
# #=> "2f:7f:97:21:76:a4:0f:38:c4:fe:d8:b4:6a:39:72:30"
|
17
|
+
# my_pubkey.fingerprint('SHA256')
|
18
|
+
# #=> "SHA256:u6mXnY8P1b0FODGp8mckqOB33u8+jvkSCtJbD5Q9klg"
|
19
|
+
module PubKeyFingerprint # :nodoc:
|
20
|
+
# Return the key's fingerprint. Algorithm may be either +MD5+ (default),
|
21
|
+
# or +SHA256+. For +SHA256+, fingerprints are in the same format
|
22
|
+
# returned by OpenSSH's <tt>`ssh-add -l -E SHA256`</tt>, i.e.,
|
23
|
+
# trailing base64 padding '=' characters are stripped and the
|
24
|
+
# literal string +SHA256:+ is prepended.
|
25
|
+
def fingerprint(algorithm = 'MD5')
|
26
|
+
@fingerprint ||= {}
|
27
|
+
@fingerprint[algorithm] ||= PubKeyFingerprint.fingerprint(to_blob, algorithm)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.fingerprint(blob, algorithm = 'MD5')
|
31
|
+
case algorithm.to_s.upcase
|
32
|
+
when 'MD5'
|
33
|
+
OpenSSL::Digest.hexdigest(algorithm, blob).scan(/../).join(":")
|
34
|
+
when 'SHA256'
|
35
|
+
"SHA256:#{[OpenSSL::Digest.digest(algorithm, blob)].pack('m').chomp.gsub(/=+\z/, '')}"
|
36
|
+
else
|
37
|
+
raise OpenSSL::Digest::DigestError, "unsupported ssh key digest #{algorithm}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -2,153 +2,171 @@ require 'net/ssh/loggable'
|
|
2
2
|
require 'net/ssh/transport/constants'
|
3
3
|
require 'net/ssh/authentication/constants'
|
4
4
|
require 'net/ssh/authentication/key_manager'
|
5
|
+
require 'net/ssh/authentication/methods/none'
|
5
6
|
require 'net/ssh/authentication/methods/publickey'
|
6
7
|
require 'net/ssh/authentication/methods/hostbased'
|
7
8
|
require 'net/ssh/authentication/methods/password'
|
8
9
|
require 'net/ssh/authentication/methods/keyboard_interactive'
|
9
10
|
|
10
|
-
module Net
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# Represents an authentication session. It manages the authentication of
|
17
|
-
# a user over an established connection (the "transport" object, see
|
18
|
-
# Net::SSH::Transport::Session).
|
19
|
-
#
|
20
|
-
# The use of an authentication session to manage user authentication is
|
21
|
-
# internal to Net::SSH (specifically Net::SSH.start). Consumers of the
|
22
|
-
# Net::SSH library will never need to access this class directly.
|
23
|
-
class Session
|
24
|
-
include Transport::Constants, Constants, Loggable
|
25
|
-
|
26
|
-
# transport layer abstraction
|
27
|
-
attr_reader :transport
|
28
|
-
|
29
|
-
# the list of authentication methods to try
|
30
|
-
attr_reader :auth_methods
|
31
|
-
|
32
|
-
# the list of authentication methods that are allowed
|
33
|
-
attr_reader :allowed_auth_methods
|
34
|
-
|
35
|
-
# a hash of options, given at construction time
|
36
|
-
attr_reader :options
|
11
|
+
module Net
|
12
|
+
module SSH
|
13
|
+
module Authentication
|
14
|
+
# Raised if the current authentication method is not allowed
|
15
|
+
class DisallowedMethod < Net::SSH::Exception
|
16
|
+
end
|
37
17
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
18
|
+
# Represents an authentication session. It manages the authentication of
|
19
|
+
# a user over an established connection (the "transport" object, see
|
20
|
+
# Net::SSH::Transport::Session).
|
21
|
+
#
|
22
|
+
# The use of an authentication session to manage user authentication is
|
23
|
+
# internal to Net::SSH (specifically Net::SSH.start). Consumers of the
|
24
|
+
# Net::SSH library will never need to access this class directly.
|
25
|
+
class Session
|
26
|
+
include Loggable
|
27
|
+
include Constants
|
28
|
+
include Transport::Constants
|
43
29
|
|
44
|
-
|
45
|
-
|
30
|
+
# transport layer abstraction
|
31
|
+
attr_reader :transport
|
46
32
|
|
47
|
-
|
48
|
-
|
33
|
+
# the list of authentication methods to try
|
34
|
+
attr_reader :auth_methods
|
49
35
|
|
50
|
-
|
51
|
-
|
52
|
-
# authenticating the user, and false otherwise.
|
53
|
-
def authenticate(next_service, username, password=nil)
|
54
|
-
debug { "beginning authentication of `#{username}'" }
|
36
|
+
# the list of authentication methods that are allowed
|
37
|
+
attr_reader :allowed_auth_methods
|
55
38
|
|
56
|
-
|
57
|
-
|
39
|
+
# a hash of options, given at construction time
|
40
|
+
attr_reader :options
|
58
41
|
|
59
|
-
|
60
|
-
|
61
|
-
|
42
|
+
# Instantiates a new Authentication::Session object over the given
|
43
|
+
# transport layer abstraction.
|
44
|
+
def initialize(transport, options = {})
|
45
|
+
self.logger = transport.logger
|
46
|
+
@transport = transport
|
62
47
|
|
63
|
-
|
48
|
+
@auth_methods = options[:auth_methods] || Net::SSH::Config.default_auth_methods
|
49
|
+
@options = options
|
64
50
|
|
65
|
-
|
66
|
-
|
67
|
-
next unless @allowed_auth_methods.include?(name)
|
68
|
-
attempted << name
|
51
|
+
@allowed_auth_methods = @auth_methods
|
52
|
+
end
|
69
53
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
54
|
+
# Attempts to authenticate the given user, in preparation for the next
|
55
|
+
# service request. Returns true if an authentication method succeeds in
|
56
|
+
# authenticating the user, and false otherwise.
|
57
|
+
def authenticate(next_service, username, password = nil)
|
58
|
+
debug { "beginning authentication of `#{username}'" }
|
59
|
+
|
60
|
+
transport.send_message(transport.service_request("ssh-userauth"))
|
61
|
+
expect_message(SERVICE_ACCEPT)
|
62
|
+
|
63
|
+
key_manager = KeyManager.new(logger, options)
|
64
|
+
keys.each { |key| key_manager.add(key) } unless keys.empty?
|
65
|
+
keycerts.each { |keycert| key_manager.add_keycert(keycert) } unless keycerts.empty?
|
66
|
+
keycert_data.each { |data| key_manager.add_keycert_data(data) } unless keycert_data.empty?
|
67
|
+
key_data.each { |key2| key_manager.add_key_data(key2) } unless key_data.empty?
|
68
|
+
default_keys.each { |key| key_manager.add(key) } unless options.key?(:keys) || options.key?(:key_data)
|
69
|
+
|
70
|
+
attempted = []
|
71
|
+
|
72
|
+
@auth_methods.each do |name|
|
73
|
+
next unless @allowed_auth_methods.include?(name)
|
74
|
+
|
75
|
+
attempted << name
|
76
|
+
|
77
|
+
debug { "trying #{name}" }
|
78
|
+
begin
|
79
|
+
auth_class = Methods.const_get(name.split(/\W+/).map { |p| p.capitalize }.join)
|
80
|
+
method = auth_class.new(self,
|
81
|
+
key_manager: key_manager, password_prompt: options[:password_prompt],
|
82
|
+
pubkey_algorithms: options[:pubkey_algorithms] || nil)
|
83
|
+
rescue NameError
|
84
|
+
debug {"Mechanism #{name} was requested, but isn't a known type. Ignoring it."}
|
85
|
+
next
|
86
|
+
end
|
87
|
+
|
88
|
+
return true if method.authenticate(next_service, username, password)
|
89
|
+
rescue Net::SSH::Authentication::DisallowedMethod
|
76
90
|
end
|
77
91
|
|
78
|
-
|
79
|
-
|
92
|
+
error { "all authorization methods failed (tried #{attempted.join(', ')})" }
|
93
|
+
return false
|
94
|
+
ensure
|
95
|
+
key_manager.finish if key_manager
|
80
96
|
end
|
81
|
-
end
|
82
|
-
|
83
|
-
error { "all authorization methods failed (tried #{attempted.join(', ')})" }
|
84
|
-
return false
|
85
|
-
ensure
|
86
|
-
key_manager.finish if key_manager
|
87
|
-
end
|
88
|
-
|
89
|
-
# Blocks until a packet is received. It silently handles USERAUTH_BANNER
|
90
|
-
# packets, and will raise an error if any packet is received that is not
|
91
|
-
# valid during user authentication.
|
92
|
-
def next_message
|
93
|
-
loop do
|
94
|
-
packet = transport.next_message
|
95
97
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
98
|
+
# Blocks until a packet is received. It silently handles USERAUTH_BANNER
|
99
|
+
# packets, and will raise an error if any packet is received that is not
|
100
|
+
# valid during user authentication.
|
101
|
+
def next_message
|
102
|
+
loop do
|
103
|
+
packet = transport.next_message
|
104
|
+
|
105
|
+
case packet.type
|
106
|
+
when USERAUTH_BANNER
|
107
|
+
info { packet[:message] }
|
108
|
+
# TODO add a hook for people to retrieve the banner when it is sent
|
109
|
+
|
110
|
+
when USERAUTH_FAILURE
|
111
|
+
@allowed_auth_methods = packet[:authentications].split(/,/)
|
112
|
+
debug { "allowed methods: #{packet[:authentications]}" }
|
113
|
+
return packet
|
114
|
+
|
115
|
+
when USERAUTH_METHOD_RANGE, SERVICE_ACCEPT
|
116
|
+
return packet
|
117
|
+
|
118
|
+
when USERAUTH_SUCCESS
|
119
|
+
transport.hint :authenticated
|
120
|
+
return packet
|
121
|
+
|
122
|
+
else
|
123
|
+
raise Net::SSH::Exception, "unexpected message #{packet.type} (#{packet})"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
100
127
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
128
|
+
# Blocks until a packet is received, and returns it if it is of the given
|
129
|
+
# type. If it is not, an exception is raised.
|
130
|
+
def expect_message(type)
|
131
|
+
message = next_message
|
132
|
+
raise Net::SSH::Exception, "expected #{type}, got #{message.type} (#{message})" unless message.type == type
|
105
133
|
|
106
|
-
|
107
|
-
|
134
|
+
message
|
135
|
+
end
|
108
136
|
|
109
|
-
|
110
|
-
transport.hint :authenticated
|
111
|
-
return packet
|
137
|
+
private
|
112
138
|
|
113
|
-
|
114
|
-
|
139
|
+
# Returns an array of paths to the key files usually defined
|
140
|
+
# by system default.
|
141
|
+
def default_keys
|
142
|
+
%w[~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/id_dsa ~/.ssh/id_ecdsa
|
143
|
+
~/.ssh2/id_ed25519 ~/.ssh2/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_ecdsa]
|
115
144
|
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
# Blocks until a packet is received, and returns it if it is of the given
|
120
|
-
# type. If it is not, an exception is raised.
|
121
|
-
def expect_message(type)
|
122
|
-
message = next_message
|
123
|
-
unless message.type == type
|
124
|
-
raise Net::SSH::Exception, "expected #{type}, got #{message.type} (#{message})"
|
125
|
-
end
|
126
|
-
message
|
127
|
-
end
|
128
145
|
|
129
|
-
|
146
|
+
# Returns an array of paths to the key files that should be used when
|
147
|
+
# attempting any key-based authentication mechanism.
|
148
|
+
def keys
|
149
|
+
Array(options[:keys])
|
150
|
+
end
|
130
151
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
%w(~/.ssh/id_dsa ~/.ssh/id_rsa ~/.ssh/id_ecdsa
|
136
|
-
~/.ssh2/id_dsa ~/.ssh2/id_rsa ~/.ssh2/id_ecdsa)
|
137
|
-
else
|
138
|
-
%w(~/.ssh/id_dsa ~/.ssh/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_rsa)
|
152
|
+
# Returns an array of paths to the keycert files that should be used when
|
153
|
+
# attempting any key-based authentication mechanism.
|
154
|
+
def keycerts
|
155
|
+
Array(options[:keycerts])
|
139
156
|
end
|
140
|
-
end
|
141
157
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
158
|
+
# Returns an array of the keycert data that should be used when
|
159
|
+
# attempting any key-based authentication mechanism.
|
160
|
+
def keycert_data
|
161
|
+
Array(options[:keycert_data])
|
162
|
+
end
|
147
163
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
164
|
+
# Returns an array of the key data that should be used when
|
165
|
+
# attempting any key-based authentication mechanism.
|
166
|
+
def key_data
|
167
|
+
Array(options[:key_data])
|
168
|
+
end
|
152
169
|
end
|
170
|
+
end
|
153
171
|
end
|
154
|
-
end
|
172
|
+
end
|