net-ssh 2.9.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.gitignore +6 -0
  4. data/.rubocop.yml +5 -0
  5. data/.rubocop_todo.yml +1129 -0
  6. data/.travis.yml +41 -5
  7. data/CHANGES.txt +133 -1
  8. data/Gemfile +13 -0
  9. data/Gemfile.norbnacl +10 -0
  10. data/Gemfile.norbnacl.lock +41 -0
  11. data/ISSUE_TEMPLATE.md +30 -0
  12. data/README.rdoc +26 -81
  13. data/Rakefile +63 -45
  14. data/appveyor.yml +51 -0
  15. data/lib/net/ssh/authentication/agent.rb +174 -14
  16. data/lib/net/ssh/authentication/ed25519.rb +137 -0
  17. data/lib/net/ssh/authentication/ed25519_loader.rb +21 -0
  18. data/lib/net/ssh/authentication/key_manager.rb +36 -30
  19. data/lib/net/ssh/authentication/methods/abstract.rb +4 -0
  20. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +16 -9
  21. data/lib/net/ssh/authentication/methods/password.rb +17 -4
  22. data/lib/net/ssh/authentication/pageant.rb +166 -45
  23. data/lib/net/ssh/authentication/session.rb +3 -2
  24. data/lib/net/ssh/buffer.rb +49 -10
  25. data/lib/net/ssh/buffered_io.rb +17 -12
  26. data/lib/net/ssh/config.rb +39 -8
  27. data/lib/net/ssh/connection/channel.rb +42 -20
  28. data/lib/net/ssh/connection/event_loop.rb +114 -0
  29. data/lib/net/ssh/connection/keepalive.rb +2 -2
  30. data/lib/net/ssh/connection/session.rb +120 -34
  31. data/lib/net/ssh/errors.rb +6 -6
  32. data/lib/net/ssh/key_factory.rb +49 -43
  33. data/lib/net/ssh/known_hosts.rb +49 -3
  34. data/lib/net/ssh/prompt.rb +47 -78
  35. data/lib/net/ssh/proxy/command.rb +31 -5
  36. data/lib/net/ssh/proxy/http.rb +15 -11
  37. data/lib/net/ssh/proxy/https.rb +49 -0
  38. data/lib/net/ssh/proxy/socks4.rb +2 -1
  39. data/lib/net/ssh/proxy/socks5.rb +3 -2
  40. data/lib/net/ssh/ruby_compat.rb +2 -29
  41. data/lib/net/ssh/service/forward.rb +2 -2
  42. data/lib/net/ssh/test/channel.rb +7 -0
  43. data/lib/net/ssh/test/extensions.rb +17 -0
  44. data/lib/net/ssh/test/kex.rb +4 -4
  45. data/lib/net/ssh/test/packet.rb +18 -2
  46. data/lib/net/ssh/test/script.rb +16 -2
  47. data/lib/net/ssh/test/socket.rb +1 -1
  48. data/lib/net/ssh/test.rb +5 -5
  49. data/lib/net/ssh/transport/algorithms.rb +92 -75
  50. data/lib/net/ssh/transport/cipher_factory.rb +19 -26
  51. data/lib/net/ssh/transport/ctr.rb +7 -9
  52. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +20 -9
  53. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +5 -3
  54. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +1 -1
  55. data/lib/net/ssh/transport/key_expander.rb +1 -0
  56. data/lib/net/ssh/transport/openssl.rb +1 -1
  57. data/lib/net/ssh/transport/packet_stream.rb +11 -3
  58. data/lib/net/ssh/transport/server_version.rb +13 -6
  59. data/lib/net/ssh/transport/session.rb +20 -10
  60. data/lib/net/ssh/transport/state.rb +1 -1
  61. data/lib/net/ssh/verifiers/secure.rb +8 -10
  62. data/lib/net/ssh/version.rb +4 -4
  63. data/lib/net/ssh.rb +62 -14
  64. data/net-ssh-public_cert.pem +19 -18
  65. data/net-ssh.gemspec +34 -194
  66. data/support/arcfour_check.rb +1 -1
  67. data/support/ssh_tunnel_bug.rb +1 -1
  68. data.tar.gz.sig +0 -0
  69. metadata +125 -109
  70. metadata.gz.sig +0 -0
  71. data/Rudyfile +0 -96
  72. data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
  73. data/lib/net/ssh/authentication/agent/socket.rb +0 -178
  74. data/setup.rb +0 -1585
  75. data/test/README.txt +0 -47
  76. data/test/authentication/methods/common.rb +0 -28
  77. data/test/authentication/methods/test_abstract.rb +0 -51
  78. data/test/authentication/methods/test_hostbased.rb +0 -114
  79. data/test/authentication/methods/test_keyboard_interactive.rb +0 -100
  80. data/test/authentication/methods/test_none.rb +0 -41
  81. data/test/authentication/methods/test_password.rb +0 -95
  82. data/test/authentication/methods/test_publickey.rb +0 -148
  83. data/test/authentication/test_agent.rb +0 -224
  84. data/test/authentication/test_key_manager.rb +0 -227
  85. data/test/authentication/test_session.rb +0 -107
  86. data/test/common.rb +0 -108
  87. data/test/configs/auth_off +0 -5
  88. data/test/configs/auth_on +0 -4
  89. data/test/configs/empty +0 -0
  90. data/test/configs/eqsign +0 -3
  91. data/test/configs/exact_match +0 -8
  92. data/test/configs/host_plus +0 -10
  93. data/test/configs/multihost +0 -4
  94. data/test/configs/negative_match +0 -6
  95. data/test/configs/nohost +0 -19
  96. data/test/configs/numeric_host +0 -4
  97. data/test/configs/send_env +0 -2
  98. data/test/configs/substitutes +0 -8
  99. data/test/configs/wild_cards +0 -14
  100. data/test/connection/test_channel.rb +0 -467
  101. data/test/connection/test_session.rb +0 -543
  102. data/test/known_hosts/github +0 -1
  103. data/test/manual/test_forward.rb +0 -285
  104. data/test/manual/test_pageant.rb +0 -37
  105. data/test/start/test_connection.rb +0 -53
  106. data/test/start/test_options.rb +0 -43
  107. data/test/start/test_transport.rb +0 -28
  108. data/test/test_all.rb +0 -11
  109. data/test/test_buffer.rb +0 -433
  110. data/test/test_buffered_io.rb +0 -63
  111. data/test/test_config.rb +0 -221
  112. data/test/test_key_factory.rb +0 -191
  113. data/test/test_known_hosts.rb +0 -13
  114. data/test/transport/hmac/test_md5.rb +0 -41
  115. data/test/transport/hmac/test_md5_96.rb +0 -27
  116. data/test/transport/hmac/test_none.rb +0 -34
  117. data/test/transport/hmac/test_ripemd160.rb +0 -36
  118. data/test/transport/hmac/test_sha1.rb +0 -36
  119. data/test/transport/hmac/test_sha1_96.rb +0 -27
  120. data/test/transport/hmac/test_sha2_256.rb +0 -37
  121. data/test/transport/hmac/test_sha2_256_96.rb +0 -27
  122. data/test/transport/hmac/test_sha2_512.rb +0 -37
  123. data/test/transport/hmac/test_sha2_512_96.rb +0 -27
  124. data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
  125. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -146
  126. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -92
  127. data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -34
  128. data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
  129. data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
  130. data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
  131. data/test/transport/test_algorithms.rb +0 -324
  132. data/test/transport/test_cipher_factory.rb +0 -443
  133. data/test/transport/test_hmac.rb +0 -34
  134. data/test/transport/test_identity_cipher.rb +0 -40
  135. data/test/transport/test_packet_stream.rb +0 -1761
  136. data/test/transport/test_server_version.rb +0 -78
  137. data/test/transport/test_session.rb +0 -331
  138. data/test/transport/test_state.rb +0 -181
@@ -25,11 +25,11 @@ module Net; module SSH; module Transport
25
25
 
26
26
  # Instantiates a new ServerVersion and immediately (and synchronously)
27
27
  # negotiates the SSH protocol in effect, using the given socket.
28
- def initialize(socket, logger)
28
+ def initialize(socket, logger, timeout = nil)
29
29
  @header = ""
30
30
  @version = nil
31
31
  @logger = logger
32
- negotiate!(socket)
32
+ negotiate!(socket, timeout)
33
33
  end
34
34
 
35
35
  private
@@ -37,9 +37,16 @@ module Net; module SSH; module Transport
37
37
  # Negotiates the SSH protocol to use, via the given socket. If the server
38
38
  # reports an incompatible SSH version (e.g., SSH1), this will raise an
39
39
  # exception.
40
- def negotiate!(socket)
40
+ def negotiate!(socket, timeout)
41
41
  info { "negotiating protocol version" }
42
42
 
43
+ debug { "local is `#{PROTO_VERSION}'" }
44
+ socket.write "#{PROTO_VERSION}\r\n"
45
+ socket.flush
46
+
47
+ if timeout && !IO.select([socket], nil, nil, timeout)
48
+ raise Net::SSH::ConnectionTimeout, "timeout during server version negotiating"
49
+ end
43
50
  loop do
44
51
  @version = ""
45
52
  loop do
@@ -63,9 +70,9 @@ module Net; module SSH; module Transport
63
70
  raise Net::SSH::Exception, "incompatible SSH version `#{@version}'"
64
71
  end
65
72
 
66
- debug { "local is `#{PROTO_VERSION}'" }
67
- socket.write "#{PROTO_VERSION}\r\n"
68
- socket.flush
73
+ if timeout && !IO.select(nil, [socket], nil, timeout)
74
+ raise Net::SSH::ConnectionTimeout, "timeout during client version negotiating"
75
+ end
69
76
  end
70
77
  end
71
78
  end; end; end
@@ -1,5 +1,4 @@
1
1
  require 'socket'
2
- require 'timeout'
3
2
 
4
3
  require 'net/ssh/errors'
5
4
  require 'net/ssh/loggable'
@@ -63,14 +62,15 @@ module Net; module SSH; module Transport
63
62
  @options = options
64
63
 
65
64
  debug { "establishing connection to #{@host}:#{@port}" }
66
- factory = options[:proxy] || TCPSocket
67
- @socket = timeout(options[:timeout] || 0) {
68
- case
69
- when options[:proxy] then factory.open(@host, @port, options)
70
- when @bind_address.nil? then factory.open(@host, @port)
71
- else factory.open(@host, @port, @bind_address)
65
+
66
+ @socket =
67
+ if (factory = options[:proxy])
68
+ factory.open(@host, @port, options)
69
+ else
70
+ Socket.tcp(@host, @port, @bind_address, nil,
71
+ connect_timeout: options[:timeout])
72
72
  end
73
- }
73
+
74
74
  @socket.extend(PacketStream)
75
75
  @socket.logger = @logger
76
76
 
@@ -81,10 +81,20 @@ module Net; module SSH; module Transport
81
81
  @host_key_verifier = select_host_key_verifier(options[:paranoid])
82
82
 
83
83
 
84
- @server_version = timeout(options[:timeout] || 0) { ServerVersion.new(socket, logger) }
84
+ @server_version = ServerVersion.new(socket, logger, options[:timeout])
85
85
 
86
86
  @algorithms = Algorithms.new(self, options)
87
+ @algorithms.start
87
88
  wait { algorithms.initialized? }
89
+ rescue Errno::ETIMEDOUT
90
+ raise Net::SSH::ConnectionTimeout
91
+ end
92
+
93
+ def host_keys
94
+ @host_keys ||= begin
95
+ known_hosts = options.fetch(:known_hosts, KnownHosts)
96
+ known_hosts.search_for(options[:host_key_alias] || host_as_string, options)
97
+ end
88
98
  end
89
99
 
90
100
  # Returns the host (and possibly IP address) in a format compatible with
@@ -154,7 +164,7 @@ module Net; module SSH; module Transport
154
164
  # Returns a hash of information about the peer (remote) side of the socket,
155
165
  # including :ip, :port, :host, and :canonized (see #host_as_string).
156
166
  def peer
157
- @peer ||= { :ip => socket.peer_ip, :port => @port.to_i, :host => @host, :canonized => host_as_string }
167
+ @peer ||= { ip: socket.peer_ip, port: @port.to_i, host: @host, canonized: host_as_string }
158
168
  end
159
169
 
160
170
  # Blocks until a new packet is available to be read, and returns that
@@ -192,7 +192,7 @@ module Net; module SSH; module Transport
192
192
 
193
193
  def update_next_iv(data, reset=false)
194
194
  @next_iv << data
195
- @next_iv = @next_iv[-cipher.iv_len..-1]
195
+ @next_iv = @next_iv[@next_iv.size-cipher.iv_len..-1]
196
196
 
197
197
  if reset
198
198
  cipher.reset
@@ -13,18 +13,16 @@ module Net; module SSH; module Verifiers
13
13
  # Otherwise, this returns true.
14
14
  class Secure
15
15
  def verify(arguments)
16
- options = arguments[:session].options
17
- host = options[:host_key_alias] || arguments[:session].host_as_string
18
- matches = Net::SSH::KnownHosts.search_for(host, arguments[:session].options)
16
+ host_keys = arguments[:session].host_keys
19
17
 
20
18
  # We've never seen this host before, so raise an exception.
21
- if matches.empty?
22
- process_cache_miss(host, arguments, HostKeyUnknown, "is unknown")
19
+ if host_keys.empty?
20
+ process_cache_miss(host_keys, arguments, HostKeyUnknown, "is unknown")
23
21
  end
24
22
 
25
23
  # If we found any matches, check to see that the key type and
26
24
  # blob also match.
27
- found = matches.any? do |key|
25
+ found = host_keys.any? do |key|
28
26
  key.ssh_type == arguments[:key].ssh_type &&
29
27
  key.to_blob == arguments[:key].to_blob
30
28
  end
@@ -32,7 +30,7 @@ module Net; module SSH; module Verifiers
32
30
  # If a match was found, return true. Otherwise, raise an exception
33
31
  # indicating that the key was not recognized.
34
32
  unless found
35
- process_cache_miss(host, arguments, HostKeyMismatch, "does not match")
33
+ process_cache_miss(host_keys, arguments, HostKeyMismatch, "does not match")
36
34
  end
37
35
 
38
36
  found
@@ -40,12 +38,12 @@ module Net; module SSH; module Verifiers
40
38
 
41
39
  private
42
40
 
43
- def process_cache_miss(host, args, exc_class, message)
41
+ def process_cache_miss(host_keys, args, exc_class, message)
44
42
  exception = exc_class.new("fingerprint #{args[:fingerprint]} " +
45
- "#{message} for #{host.inspect}")
43
+ "#{message} for #{host_keys.host.inspect}")
46
44
  exception.data = args
47
45
  exception.callback = Proc.new do
48
- Net::SSH::KnownHosts.add(host, args[:key], args[:session].options)
46
+ host_keys.add_host_key(args[:key])
49
47
  end
50
48
  raise exception
51
49
  end
@@ -45,15 +45,15 @@ module Net; module SSH
45
45
  end
46
46
 
47
47
  # The major component of this version of the Net::SSH library
48
- MAJOR = 2
48
+ MAJOR = 4
49
49
 
50
50
  # The minor component of this version of the Net::SSH library
51
- MINOR = 9
51
+ MINOR = 0
52
52
 
53
53
  # The tiny component of this version of the Net::SSH library
54
- TINY = 2
54
+ TINY = 0
55
55
 
56
- # The prerelease component of this version of the Net::SSH library
56
+ # The prerelease component of this version of the Net::SSH library
57
57
  # nil allowed
58
58
  PRE = nil
59
59
 
data/lib/net/ssh.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  ENV['HOME'] ||= ENV['HOMEPATH'] ? "#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}" : Dir.pwd
4
4
 
5
5
  require 'logger'
6
+ require 'etc'
6
7
 
7
8
  require 'net/ssh/config'
8
9
  require 'net/ssh/errors'
@@ -10,6 +11,7 @@ require 'net/ssh/loggable'
10
11
  require 'net/ssh/transport/session'
11
12
  require 'net/ssh/authentication/session'
12
13
  require 'net/ssh/connection/session'
14
+ require 'net/ssh/prompt'
13
15
 
14
16
  module Net
15
17
 
@@ -39,21 +41,21 @@ module Net
39
41
  #
40
42
  # == X == "execute a command and capture the output"
41
43
  #
42
- # Net::SSH.start("host", "user", :password => "password") do |ssh|
44
+ # Net::SSH.start("host", "user", password: "password") do |ssh|
43
45
  # result = ssh.exec!("ls -l")
44
46
  # puts result
45
47
  # end
46
48
  #
47
49
  # == X == "forward connections on a local port to a remote host"
48
50
  #
49
- # Net::SSH.start("host", "user", :password => "password") do |ssh|
51
+ # Net::SSH.start("host", "user", password: "password") do |ssh|
50
52
  # ssh.forward.local(1234, "www.google.com", 80)
51
53
  # ssh.loop { true }
52
54
  # end
53
55
  #
54
56
  # == X == "forward connections on a remote port to the local host"
55
57
  #
56
- # Net::SSH.start("host", "user", :password => "password") do |ssh|
58
+ # Net::SSH.start("host", "user", password: "password") do |ssh|
57
59
  # ssh.forward.remote(80, "www.google.com", 1234)
58
60
  # ssh.loop { true }
59
61
  # end
@@ -62,13 +64,15 @@ module Net
62
64
  # Net::SSH.start for a description of each option.
63
65
  VALID_OPTIONS = [
64
66
  :auth_methods, :bind_address, :compression, :compression_level, :config,
65
- :encryption, :forward_agent, :hmac, :host_key,
67
+ :encryption, :forward_agent, :hmac, :host_key, :remote_user,
66
68
  :keepalive, :keepalive_interval, :keepalive_maxcount, :kex, :keys, :key_data,
67
69
  :languages, :logger, :paranoid, :password, :port, :proxy,
68
70
  :rekey_blocks_limit,:rekey_limit, :rekey_packet_limit, :timeout, :verbose,
69
- :global_known_hosts_file, :user_known_hosts_file, :host_key_alias,
71
+ :known_hosts, :global_known_hosts_file, :user_known_hosts_file, :host_key_alias,
70
72
  :host_name, :user, :properties, :passphrase, :keys_only, :max_pkt_size,
71
- :max_win_size, :send_env, :use_agent, :number_of_password_prompts
73
+ :max_win_size, :send_env, :use_agent, :number_of_password_prompts,
74
+ :append_supported_algorithms, :non_interactive, :password_prompt, :agent_socket_factory,
75
+ :minimum_dh_bits
72
76
  ]
73
77
 
74
78
  # The standard means of starting a new SSH connection. When used with a
@@ -113,6 +117,8 @@ module Net
113
117
  # * :encryption => the encryption cipher (or ciphers) to use
114
118
  # * :forward_agent => set to true if you want the SSH agent connection to
115
119
  # be forwarded
120
+ # * :known_hosts => a custom object holding known hosts records.
121
+ # It must implement #search_for and add in a similiar manner as KnownHosts.
116
122
  # * :global_known_hosts_file => the location of the global known hosts
117
123
  # file. Set to an array if you want to specify multiple global known
118
124
  # hosts files. Defaults to %w(/etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2).
@@ -131,6 +137,7 @@ module Net
131
137
  # * :keepalive_interval => the interval seconds for keepalive.
132
138
  # Defaults to +300+ seconds.
133
139
  # * :keepalive_maxcount => the maximun number of keepalive packet miss allowed.
140
+ # Defaults to 3
134
141
  # * :kex => the key exchange algorithm (or algorithms) to use
135
142
  # * :keys => an array of file names of private keys to use for publickey
136
143
  # and hostbased authentication
@@ -146,6 +153,10 @@ module Net
146
153
  # for better performance if your SSH server supports it (most do).
147
154
  # * :max_win_size => maximum size we tell the other side that is supported for
148
155
  # the window.
156
+ # * :non_interactive => set to true if your app is non interactive and prefers
157
+ # authentication failure vs password prompt. Non-interactive applications
158
+ # should set it to true to prefer failing a password/etc auth methods vs.
159
+ # asking for password.
149
160
  # * :paranoid => either false, true, :very, or :secure specifying how
150
161
  # strict host-key verification should be (in increasing order here).
151
162
  # You can also provide an own Object which responds to +verify+. The argument
@@ -168,33 +179,48 @@ module Net
168
179
  # * :user => the user name to log in as; this overrides the +user+
169
180
  # parameter, and is primarily only useful when provided via an SSH
170
181
  # configuration file.
182
+ # * :remote_user => used for substitution into the '%r' part of a ProxyCommand
171
183
  # * :user_known_hosts_file => the location of the user known hosts file.
172
184
  # Set to an array to specify multiple user known hosts files.
173
185
  # Defaults to %w(~/.ssh/known_hosts ~/.ssh/known_hosts2).
174
- # * :use_agent => Set false to disable the use of ssh-agent. Defaults to
186
+ # * :use_agent => Set false to disable the use of ssh-agent. Defaults to
175
187
  # true
176
188
  # * :verbose => how verbose to be (Logger verbosity constants, Logger::DEBUG
177
189
  # is very verbose, Logger::FATAL is all but silent). Logger::FATAL is the
178
190
  # default. The symbols :debug, :info, :warn, :error, and :fatal are also
179
191
  # supported and are translated to the corresponding Logger constant.
180
- def self.start(host, user, options={}, &block)
192
+ # * :append_all_supported_algorithms => set to +true+ to append all supported
193
+ # algorithms by net-ssh. Was the default behaviour until 2.10
194
+ # * :number_of_password_prompts => Number of prompts for the password
195
+ # authentication method defaults to 3 set to 0 to disable prompt for
196
+ # password auth method
197
+ # * :password_prompt => a custom prompt object with ask method. See Net::SSH::Prompt
198
+ #
199
+ # * :agent_socket_factory => enables the user to pass a lambda/block that will serve as the socket factory
200
+ # Net::SSH::start(user,host,agent_socket_factory: ->{ UNIXSocket.open('/foo/bar') })
201
+ # example: ->{ UNIXSocket.open('/foo/bar')}
202
+ # If +user+ parameter is nil it defaults to USER from ssh_config, or
203
+ # local username
204
+ def self.start(host, user=nil, options={}, &block)
181
205
  invalid_options = options.keys - VALID_OPTIONS
182
206
  if invalid_options.any?
183
207
  raise ArgumentError, "invalid option(s): #{invalid_options.join(', ')}"
184
208
  end
185
209
 
210
+ assign_defaults(options)
211
+ _sanitize_options(options)
212
+
186
213
  options[:user] = user if user
187
214
  options = configuration_for(host, options.fetch(:config, true)).merge(options)
188
215
  host = options.fetch(:host_name, host)
189
216
 
190
- if !options.key?(:logger)
191
- options[:logger] = Logger.new(STDERR)
192
- options[:logger].level = Logger::FATAL
217
+ if options[:non_interactive]
218
+ options[:number_of_password_prompts] = 0
193
219
  end
194
220
 
195
221
  if options[:verbose]
196
222
  options[:logger].level = case options[:verbose]
197
- when Fixnum then options[:verbose]
223
+ when Integer then options[:verbose]
198
224
  when :debug then Logger::DEBUG
199
225
  when :info then Logger::INFO
200
226
  when :warn then Logger::WARN
@@ -207,7 +233,7 @@ module Net
207
233
  transport = Transport::Session.new(host, options)
208
234
  auth = Authentication::Session.new(transport, options)
209
235
 
210
- user = options.fetch(:user, user)
236
+ user = options.fetch(:user, user) || Etc.getlogin
211
237
  if auth.authenticate("ssh-connection", user, options[:password])
212
238
  connection = Connection::Session.new(transport, options)
213
239
  if block_given?
@@ -234,7 +260,7 @@ module Net
234
260
  # to read.
235
261
  #
236
262
  # See Net::SSH::Config for the full description of all supported options.
237
- def self.configuration_for(host, use_ssh_config=true)
263
+ def self.configuration_for(host, use_ssh_config)
238
264
  files = case use_ssh_config
239
265
  when true then Net::SSH::Config.default_files
240
266
  when false, nil then return {}
@@ -243,5 +269,27 @@ module Net
243
269
 
244
270
  Net::SSH::Config.for(host, files)
245
271
  end
272
+
273
+ def self.assign_defaults(options)
274
+ if !options[:logger]
275
+ options[:logger] = Logger.new(STDERR)
276
+ options[:logger].level = Logger::FATAL
277
+ end
278
+
279
+ options[:password_prompt] ||= Prompt.default(options)
280
+
281
+ [:password, :passphrase].each do |key|
282
+ options.delete(key) if options.key?(key) && options[key].nil?
283
+ end
284
+ end
285
+
286
+ def self._sanitize_options(options)
287
+ invalid_option_values = [nil,[nil]]
288
+ unless (options.values & invalid_option_values).empty?
289
+ nil_options = options.select { |_k,v| invalid_option_values.include?(v) }.map(&:first)
290
+ Kernel.warn "#{caller_locations(2, 1)[0]}: Passing nil, or [nil] to Net::SSH.start is deprecated for keys: #{nil_options.join(', ')}"
291
+ end
292
+ end
293
+ private_class_method :_sanitize_options
246
294
  end
247
295
  end
@@ -1,20 +1,21 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIDODCCAiCgAwIBAgIBADANBgkqhkiG9w0BAQUFADBCMRAwDgYDVQQDDAduZXQt
3
- c3NoMRkwFwYKCZImiZPyLGQBGRYJc29sdXRpb3VzMRMwEQYKCZImiZPyLGQBGRYD
4
- Y29tMB4XDTE0MTIwMjE3MzkyMFoXDTE1MTIwMjE3MzkyMFowQjEQMA4GA1UEAwwH
5
- bmV0LXNzaDEZMBcGCgmSJomT8ixkARkWCXNvbHV0aW91czETMBEGCgmSJomT8ixk
6
- ARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0qnw4JV5JN
7
- MWelqu7pnW2z6GZJ7+zLFYJQNETJyF0U5zo7aCRK08OeUxnpu/TCCXK8iQVkNLfz
8
- 9pVIhF+X8pMEIruAkYGwBt1aWfuSNeyodyMk0vpZdxBHbOTJ4qBRUc6qOtNOeOzv
9
- 8ObYUX52P/EMMaeXTRU+e7MGkB9pb6FvPPNx5akxwIaoRvtcMsc/hJnQuP5r96w6
10
- t06MgKbXhWAX6gev0RVlrQqzxXst6iuvsrgZGjFqzob5wbTiX9M0+bFAB0EI7tJC
11
- sv5keEbtNRaU7p3ZbMm4wTHHJLOtD+BpUCSzwv4ToNj9mZtJBMYw2Eeo7z1DklEG
12
- mr95zbe+zNMCAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQU1bTfpzmitXwv
13
- LmTXi0IO5vd8NGYwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQA0Aps8
14
- UPINGa8XUUtrZtzrgX0/iyXNkKY1ld85g1N3WKEAVLfQI7TlGr0Qv2Ekx6RqlxbR
15
- Vyq08pytSnghW2otR3bIGMGQzqxAeRLb25cjEwH7YIJ32n7ZC1fpMnBZOBDmueWA
16
- B9EonmoO3ne7AJSgIvBbZzBPhzM4HrQGRW8LsPFsuj+dcJI43HOQwkmv2TRz0+t6
17
- mGZldmqLcK0abv4JepLfB9XTue3kuyA29NGBibqyvRwlKckLpvKfHZX6Jxad8xxm
18
- MbvRpzgROzyfw1qYi4dnIyMwTtXFFcZ0a2jpxHPkcTYFK6TzvFgDLAP0Y/u9jqUQ
19
- eZ7/3CdSi/isZHEw
2
+ MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMQ8wDQYDVQQDDAZuZXRz
3
+ c2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj
4
+ b20wHhcNMTYxMjE1MTgwNTIyWhcNMTcxMjE1MTgwNTIyWjBBMQ8wDQYDVQQDDAZu
5
+ ZXRzc2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ
6
+ FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGJ4TbZ9H+qZ08
7
+ pQfJhPJTHaDCyQvCsKTFrL5O9z3tllQ7B/zksMMM+qFBpNYu9HCcg4yBATacE/PB
8
+ qVVyUrpr6lbH/XwoN5ljXm+bdCfmnjZvTCL2FTE6o+bcnaF0IsJyC0Q2B1fbWdXN
9
+ 6Off1ZWoUk6We2BIM1bn6QJLxBpGyYhvOPXsYoqSuzDf2SJDDsWFZ8kV5ON13Ohm
10
+ JbBzn0oD8HF8FuYOewwsC0C1q4w7E5GtvHcQ5juweS7+RKsyDcVcVrLuNzoGRttS
11
+ KP4yMn+TzaXijyjRg7gECfJr3TGASaA4bQsILFGG5dAWcwO4OMrZedR7SHj/o0Kf
12
+ 3gL7P0axAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
13
+ BBQF8qLA7Z4zg0SJGtUbv3eoQ8tjIzAfBgNVHREEGDAWgRRuZXRzc2hAc29sdXRp
14
+ b3VzLmNvbTAfBgNVHRIEGDAWgRRuZXRzc2hAc29sdXRpb3VzLmNvbTANBgkqhkiG
15
+ 9w0BAQUFAAOCAQEATd8If+Ytmhf5lELy24j76ahGv64m518WTCdV2nIViGXB2BnV
16
+ uLQylGRb1rcgUS3Eh9TE28hqrfhotKS6a96qF9kN0mY2H6UwPWswJ+tj3gA1vLW8
17
+ wlZNlYGJ91Ig9zULPSbATyOOprUZyggy5p1260BaaI3LQYDeGJOSqpHCVu+TuMcy
18
+ k00ofiLT1crDSUl2WE/OIFK8AXpmd798AMsef8okHeoo+Dj7zCXn0VSimN+MO1mE
19
+ L4d54WIy4HkZCqQXoTSiK5HZMIdXkPk3F1bZdJ8Dy1sMRru0rUkkM5mW7TQ75mfW
20
+ Zp0QrZyNZhtitrXFbZneGRrIA/8G2Krft5Ly/A==
20
21
  -----END CERTIFICATE-----
data/net-ssh.gemspec CHANGED
@@ -1,203 +1,43 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
- # stub: net-ssh 2.9.2 ruby lib
1
+ # coding: utf-8
2
+ require_relative 'lib/net/ssh/version'
6
3
 
7
- Gem::Specification.new do |s|
8
- s.name = "net-ssh"
9
- s.version = "2.9.2"
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "net-ssh"
6
+ spec.version = Net::SSH::Version::STRING
7
+ spec.authors = ["Jamis Buck", "Delano Mandelbaum", "Mikl\u{f3}s Fazekas"]
8
+ spec.email = ["net-ssh@solutious.com"]
10
9
 
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
- s.authors = ["Jamis Buck", "Delano Mandelbaum", "Mikl\u{f3}s Fazekas"]
14
- s.cert_chain = ["net-ssh-public_cert.pem"]
15
- s.date = "2015-01-09"
16
- s.description = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol. It allows you to write programs that invoke and interact with processes on remote servers, via SSH2."
17
- s.email = "net-ssh@solutious.com"
18
- s.extra_rdoc_files = [
10
+ if ENV['NET_SSH_BUILDGEM_SIGNED']
11
+ spec.cert_chain = ["net-ssh-public_cert.pem"]
12
+ spec.signing_key = "/mnt/gem/net-ssh-private_key.pem"
13
+ end
14
+
15
+ spec.summary = %q{Net::SSH: a pure-Ruby implementation of the SSH2 client protocol.}
16
+ spec.description = %q{Net::SSH: a pure-Ruby implementation of the SSH2 client protocol. It allows you to write programs that invoke and interact with processes on remote servers, via SSH2.}
17
+ spec.homepage = "https://github.com/net-ssh/net-ssh"
18
+ spec.license = "MIT"
19
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.0")
20
+
21
+ spec.extra_rdoc_files = [
19
22
  "LICENSE.txt",
20
23
  "README.rdoc"
21
24
  ]
22
- s.files = [
23
- ".travis.yml",
24
- "CHANGES.txt",
25
- "LICENSE.txt",
26
- "Manifest",
27
- "README.rdoc",
28
- "Rakefile",
29
- "Rudyfile",
30
- "THANKS.txt",
31
- "lib/net/ssh.rb",
32
- "lib/net/ssh/authentication/agent.rb",
33
- "lib/net/ssh/authentication/agent/java_pageant.rb",
34
- "lib/net/ssh/authentication/agent/socket.rb",
35
- "lib/net/ssh/authentication/constants.rb",
36
- "lib/net/ssh/authentication/key_manager.rb",
37
- "lib/net/ssh/authentication/methods/abstract.rb",
38
- "lib/net/ssh/authentication/methods/hostbased.rb",
39
- "lib/net/ssh/authentication/methods/keyboard_interactive.rb",
40
- "lib/net/ssh/authentication/methods/none.rb",
41
- "lib/net/ssh/authentication/methods/password.rb",
42
- "lib/net/ssh/authentication/methods/publickey.rb",
43
- "lib/net/ssh/authentication/pageant.rb",
44
- "lib/net/ssh/authentication/session.rb",
45
- "lib/net/ssh/buffer.rb",
46
- "lib/net/ssh/buffered_io.rb",
47
- "lib/net/ssh/config.rb",
48
- "lib/net/ssh/connection/channel.rb",
49
- "lib/net/ssh/connection/constants.rb",
50
- "lib/net/ssh/connection/keepalive.rb",
51
- "lib/net/ssh/connection/session.rb",
52
- "lib/net/ssh/connection/term.rb",
53
- "lib/net/ssh/errors.rb",
54
- "lib/net/ssh/key_factory.rb",
55
- "lib/net/ssh/known_hosts.rb",
56
- "lib/net/ssh/loggable.rb",
57
- "lib/net/ssh/packet.rb",
58
- "lib/net/ssh/prompt.rb",
59
- "lib/net/ssh/proxy/command.rb",
60
- "lib/net/ssh/proxy/errors.rb",
61
- "lib/net/ssh/proxy/http.rb",
62
- "lib/net/ssh/proxy/socks4.rb",
63
- "lib/net/ssh/proxy/socks5.rb",
64
- "lib/net/ssh/ruby_compat.rb",
65
- "lib/net/ssh/service/forward.rb",
66
- "lib/net/ssh/test.rb",
67
- "lib/net/ssh/test/channel.rb",
68
- "lib/net/ssh/test/extensions.rb",
69
- "lib/net/ssh/test/kex.rb",
70
- "lib/net/ssh/test/local_packet.rb",
71
- "lib/net/ssh/test/packet.rb",
72
- "lib/net/ssh/test/remote_packet.rb",
73
- "lib/net/ssh/test/script.rb",
74
- "lib/net/ssh/test/socket.rb",
75
- "lib/net/ssh/transport/algorithms.rb",
76
- "lib/net/ssh/transport/cipher_factory.rb",
77
- "lib/net/ssh/transport/constants.rb",
78
- "lib/net/ssh/transport/ctr.rb",
79
- "lib/net/ssh/transport/hmac.rb",
80
- "lib/net/ssh/transport/hmac/abstract.rb",
81
- "lib/net/ssh/transport/hmac/md5.rb",
82
- "lib/net/ssh/transport/hmac/md5_96.rb",
83
- "lib/net/ssh/transport/hmac/none.rb",
84
- "lib/net/ssh/transport/hmac/ripemd160.rb",
85
- "lib/net/ssh/transport/hmac/sha1.rb",
86
- "lib/net/ssh/transport/hmac/sha1_96.rb",
87
- "lib/net/ssh/transport/hmac/sha2_256.rb",
88
- "lib/net/ssh/transport/hmac/sha2_256_96.rb",
89
- "lib/net/ssh/transport/hmac/sha2_512.rb",
90
- "lib/net/ssh/transport/hmac/sha2_512_96.rb",
91
- "lib/net/ssh/transport/identity_cipher.rb",
92
- "lib/net/ssh/transport/kex.rb",
93
- "lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb",
94
- "lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb",
95
- "lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb",
96
- "lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb",
97
- "lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb",
98
- "lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb",
99
- "lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb",
100
- "lib/net/ssh/transport/key_expander.rb",
101
- "lib/net/ssh/transport/openssl.rb",
102
- "lib/net/ssh/transport/packet_stream.rb",
103
- "lib/net/ssh/transport/server_version.rb",
104
- "lib/net/ssh/transport/session.rb",
105
- "lib/net/ssh/transport/state.rb",
106
- "lib/net/ssh/verifiers/lenient.rb",
107
- "lib/net/ssh/verifiers/null.rb",
108
- "lib/net/ssh/verifiers/secure.rb",
109
- "lib/net/ssh/verifiers/strict.rb",
110
- "lib/net/ssh/version.rb",
111
- "net-ssh-public_cert.pem",
112
- "net-ssh.gemspec",
113
- "setup.rb",
114
- "support/arcfour_check.rb",
115
- "support/ssh_tunnel_bug.rb",
116
- "test/README.txt",
117
- "test/authentication/methods/common.rb",
118
- "test/authentication/methods/test_abstract.rb",
119
- "test/authentication/methods/test_hostbased.rb",
120
- "test/authentication/methods/test_keyboard_interactive.rb",
121
- "test/authentication/methods/test_none.rb",
122
- "test/authentication/methods/test_password.rb",
123
- "test/authentication/methods/test_publickey.rb",
124
- "test/authentication/test_agent.rb",
125
- "test/authentication/test_key_manager.rb",
126
- "test/authentication/test_session.rb",
127
- "test/common.rb",
128
- "test/configs/auth_off",
129
- "test/configs/auth_on",
130
- "test/configs/empty",
131
- "test/configs/eqsign",
132
- "test/configs/exact_match",
133
- "test/configs/host_plus",
134
- "test/configs/multihost",
135
- "test/configs/negative_match",
136
- "test/configs/nohost",
137
- "test/configs/numeric_host",
138
- "test/configs/send_env",
139
- "test/configs/substitutes",
140
- "test/configs/wild_cards",
141
- "test/connection/test_channel.rb",
142
- "test/connection/test_session.rb",
143
- "test/known_hosts/github",
144
- "test/manual/test_forward.rb",
145
- "test/manual/test_pageant.rb",
146
- "test/start/test_connection.rb",
147
- "test/start/test_options.rb",
148
- "test/start/test_transport.rb",
149
- "test/test_all.rb",
150
- "test/test_buffer.rb",
151
- "test/test_buffered_io.rb",
152
- "test/test_config.rb",
153
- "test/test_key_factory.rb",
154
- "test/test_known_hosts.rb",
155
- "test/transport/hmac/test_md5.rb",
156
- "test/transport/hmac/test_md5_96.rb",
157
- "test/transport/hmac/test_none.rb",
158
- "test/transport/hmac/test_ripemd160.rb",
159
- "test/transport/hmac/test_sha1.rb",
160
- "test/transport/hmac/test_sha1_96.rb",
161
- "test/transport/hmac/test_sha2_256.rb",
162
- "test/transport/hmac/test_sha2_256_96.rb",
163
- "test/transport/hmac/test_sha2_512.rb",
164
- "test/transport/hmac/test_sha2_512_96.rb",
165
- "test/transport/kex/test_diffie_hellman_group14_sha1.rb",
166
- "test/transport/kex/test_diffie_hellman_group1_sha1.rb",
167
- "test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb",
168
- "test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb",
169
- "test/transport/kex/test_ecdh_sha2_nistp256.rb",
170
- "test/transport/kex/test_ecdh_sha2_nistp384.rb",
171
- "test/transport/kex/test_ecdh_sha2_nistp521.rb",
172
- "test/transport/test_algorithms.rb",
173
- "test/transport/test_cipher_factory.rb",
174
- "test/transport/test_hmac.rb",
175
- "test/transport/test_identity_cipher.rb",
176
- "test/transport/test_packet_stream.rb",
177
- "test/transport/test_server_version.rb",
178
- "test/transport/test_session.rb",
179
- "test/transport/test_state.rb"
180
- ]
181
- s.homepage = "https://github.com/net-ssh/net-ssh"
182
- s.licenses = ["MIT"]
183
- s.rubyforge_project = "net-ssh"
184
- s.rubygems_version = "2.2.2"
185
- s.signing_key = "/mnt/gem/net-ssh-private_key.pem"
186
- s.summary = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
187
25
 
188
- if s.respond_to? :specification_version then
189
- s.specification_version = 4
26
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
+ spec.bindir = "exe"
28
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
190
30
 
191
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
192
- s.add_development_dependency(%q<test-unit>, [">= 0"])
193
- s.add_development_dependency(%q<mocha>, [">= 0"])
194
- else
195
- s.add_dependency(%q<test-unit>, [">= 0"])
196
- s.add_dependency(%q<mocha>, [">= 0"])
197
- end
198
- else
199
- s.add_dependency(%q<test-unit>, [">= 0"])
200
- s.add_dependency(%q<mocha>, [">= 0"])
31
+ unless ENV['NET_SSH_NO_RBNACL']
32
+ spec.add_development_dependency("rbnacl-libsodium", "~> 1.0.10")
33
+ spec.add_development_dependency("rbnacl", "~> 3.4.0")
34
+ spec.add_development_dependency("bcrypt_pbkdf", "~> 1.0.0") unless RUBY_PLATFORM == "java"
201
35
  end
202
- end
203
36
 
37
+ spec.add_development_dependency "bundler", "~> 1.11"
38
+
39
+ spec.add_development_dependency "rake", "~> 12.0"
40
+ spec.add_development_dependency "minitest", "~> 5.10"
41
+ spec.add_development_dependency "rubocop", "~> 0.46.0"
42
+ spec.add_development_dependency "mocha", ">= 1.2.1"
43
+ end
@@ -14,7 +14,7 @@ require 'net/ssh'
14
14
  [['arcfour128', 16], ['arcfour256', 32], ['arcfour512', 64]].each do |cipher|
15
15
  print "#{cipher[0]}: "
16
16
  a = Net::SSH::Transport::CipherFactory.get_lengths(cipher[0])
17
- b = Net::SSH::Transport::CipherFactory.get(cipher[0], :key => ([].fill('x', 0, cipher[1]).join))
17
+ b = Net::SSH::Transport::CipherFactory.get(cipher[0], key: ([].fill('x', 0, cipher[1]).join))
18
18
  puts "#{a} #{b.class}"
19
19
  end
20
20