net-ssh 4.0.0.rc1 → 4.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.rubocop_todo.yml +189 -208
- data/.travis.yml +9 -8
- data/CHANGES.txt +6 -0
- data/Gemfile +5 -4
- data/Gemfile.norbnacl +2 -2
- data/Gemfile.norbnacl.lock +2 -2
- data/README.rdoc +14 -0
- data/Rakefile +2 -2
- data/lib/net/ssh.rb +20 -13
- data/lib/net/ssh/authentication/key_manager.rb +6 -6
- data/lib/net/ssh/authentication/pageant.rb +11 -7
- data/lib/net/ssh/buffer.rb +21 -8
- data/lib/net/ssh/config.rb +2 -2
- data/lib/net/ssh/connection/channel.rb +6 -6
- data/lib/net/ssh/connection/event_loop.rb +12 -8
- data/lib/net/ssh/connection/session.rb +2 -2
- data/lib/net/ssh/errors.rb +6 -6
- data/lib/net/ssh/key_factory.rb +5 -8
- data/lib/net/ssh/prompt.rb +4 -6
- data/lib/net/ssh/proxy/http.rb +5 -5
- data/lib/net/ssh/test.rb +1 -1
- data/lib/net/ssh/test/kex.rb +4 -4
- data/lib/net/ssh/transport/algorithms.rb +49 -46
- data/lib/net/ssh/transport/cipher_factory.rb +4 -4
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +20 -9
- data/lib/net/ssh/transport/session.rb +1 -1
- data/lib/net/ssh/version.rb +1 -1
- data/net-ssh-public_cert.pem +19 -18
- data/net-ssh.gemspec +4 -5
- data/support/arcfour_check.rb +1 -1
- data/support/ssh_tunnel_bug.rb +1 -1
- metadata +52 -52
- metadata.gz.sig +0 -0
data/.travis.yml
CHANGED
@@ -7,25 +7,26 @@ rvm:
|
|
7
7
|
- 2.1
|
8
8
|
- 2.2
|
9
9
|
- 2.3.0
|
10
|
-
-
|
11
|
-
-
|
10
|
+
- 2.4.0-rc1
|
11
|
+
- jruby-9.1.6.0
|
12
|
+
- rbx-3.69
|
12
13
|
- ruby-head
|
13
14
|
env:
|
14
15
|
NET_SSH_RUN_INTEGRATION_TESTS=1
|
15
16
|
|
16
17
|
matrix:
|
17
18
|
exclude:
|
18
|
-
- rvm: rbx-3.
|
19
|
-
- rvm: jruby-9.1.
|
19
|
+
- rvm: rbx-3.69
|
20
|
+
- rvm: jruby-9.1.6.0
|
20
21
|
include:
|
21
|
-
- rvm: rbx-3.
|
22
|
+
- rvm: rbx-3.69
|
22
23
|
env: NET_SSH_RUN_INTEGRATION_TESTS=
|
23
|
-
- rvm: jruby-9.1.
|
24
|
+
- rvm: jruby-9.1.6.0
|
24
25
|
env: JRUBY_OPTS='--client -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1 -Xcext.enabled=false -J-Xss2m -Xcompile.invokedynamic=false' NET_SSH_RUN_INTEGRATION_TESTS=
|
25
26
|
fast_finish: true
|
26
27
|
allow_failures:
|
27
|
-
- rvm: rbx-3.
|
28
|
-
- rvm: jruby-9.1.
|
28
|
+
- rvm: rbx-3.69
|
29
|
+
- rvm: jruby-9.1.6.0
|
29
30
|
- rvm: ruby-head
|
30
31
|
|
31
32
|
install:
|
data/CHANGES.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 4.0.0.rc2
|
2
|
+
|
3
|
+
* Fixed OpenSSL 2.0/Ruby 2.4.0 warnings [Miklós Fazekas, #468]
|
4
|
+
* Added ssh-ed25519 to KnownHosts:SUPPORTED_TYPE [detatka-kuzlatka-otevrete, Miklós Fazekas, #459]
|
5
|
+
* Allow nil for :passhrase and passing in nil option is now a depreaction warning [Miklós Fazekas, #465]
|
6
|
+
|
1
7
|
=== 4.0.0.rc1
|
2
8
|
|
3
9
|
* Allow :password to be nil for capistrano v2 compatibility [Will Bryant, #357]
|
data/Gemfile
CHANGED
@@ -3,10 +3,11 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in mygem.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
|
6
|
+
if !Gem.win_platform? && RUBY_ENGINE == "mri"
|
7
7
|
gem 'byebug', group: [:development, :test]
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
gem '
|
10
|
+
if ENV["CI"]
|
11
|
+
gem 'codecov', require: false, group: :test
|
12
|
+
gem 'simplecov', require: false, group: :test
|
13
|
+
end
|
data/Gemfile.norbnacl
CHANGED
@@ -4,7 +4,7 @@ ENV['NET_SSH_NO_RBNACL'] = 'true'
|
|
4
4
|
# Specify your gem's dependencies in mygem.gemspec
|
5
5
|
gemspec
|
6
6
|
|
7
|
-
|
7
|
+
if ENV["CI"] && !Gem.win_platform?
|
8
8
|
gem 'simplecov', require: false, group: :test
|
9
|
-
gem 'codecov', require: false, group: :test
|
9
|
+
gem 'codecov', require: false, group: :test
|
10
10
|
end
|
data/Gemfile.norbnacl.lock
CHANGED
data/README.rdoc
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
{<img src="https://badge.fury.io/rb/net-ssh.svg" alt="Gem Version" />}[https://badge.fury.io/rb/net-ssh]
|
2
2
|
{<img src="https://badges.gitter.im/net-ssh/net-ssh.svg" alt="Join the chat at https://gitter.im/net-ssh/net-ssh">}[https://gitter.im/net-ssh/net-ssh?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge]
|
3
3
|
{<img src="https://travis-ci.org/net-ssh/net-ssh.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/net-ssh/net-ssh]
|
4
|
+
{<img src="https://codecov.io/gh/net-ssh/net-ssh/branch/master/graph/badge.svg" alt="Coverage status" />}[https://codecov.io/gh/net-ssh/net-ssh]
|
4
5
|
|
5
6
|
= Net::SSH 4.x
|
6
7
|
|
@@ -129,6 +130,19 @@ To run integration tests see test/integration/README.txt
|
|
129
130
|
|
130
131
|
rake build
|
131
132
|
|
133
|
+
=== GEM SIGNING (for maintainers)
|
134
|
+
|
135
|
+
If you have the net-ssh private signing key, you will be able to create signed release builds. Make sure the private key path matches the `signing_key` path set in `net-ssh.gemspec` and tell rake to sign the gem by setting the `NET_SSH_BUILDGEM_SIGNED` flag:
|
136
|
+
|
137
|
+
NET_SSH_BUILDGEM_SIGNED=true rake build
|
138
|
+
|
139
|
+
For time to time, the public certificate associated to the private key needs to be renewed. You can do this with the following command:
|
140
|
+
|
141
|
+
gem cert --build netssh@solutious.com --private-key path/2/net-ssh-private_key.pem
|
142
|
+
mv gem-public_cert.pem net-ssh-public_cert.pem
|
143
|
+
gem cert --add net-ssh-public_cert.pem
|
144
|
+
|
145
|
+
|
132
146
|
== LICENSE:
|
133
147
|
|
134
148
|
(The MIT License)
|
data/Rakefile
CHANGED
@@ -22,14 +22,14 @@ Rake::Task[:release].enhance [:check_NET_SSH_BUILDGEM_SIGNED]
|
|
22
22
|
Rake::Task[:release].prerequisites.unshift(:check_NET_SSH_BUILDGEM_SIGNED)
|
23
23
|
|
24
24
|
|
25
|
-
task :
|
25
|
+
task default: ["build"]
|
26
26
|
CLEAN.include [ 'pkg', 'rdoc' ]
|
27
27
|
name = "net-ssh"
|
28
28
|
|
29
29
|
require_relative "lib/net/ssh/version"
|
30
30
|
version = Net::SSH::Version::CURRENT
|
31
31
|
|
32
|
-
extra_files = %w[LICENSE.txt THANKS.txt CHANGES.txt
|
32
|
+
extra_files = %w[LICENSE.txt THANKS.txt CHANGES.txt]
|
33
33
|
RDoc::Task.new do |rdoc|
|
34
34
|
rdoc.rdoc_dir = "rdoc"
|
35
35
|
rdoc.title = "#{name} #{version}"
|
data/lib/net/ssh.rb
CHANGED
@@ -41,21 +41,21 @@ module Net
|
|
41
41
|
#
|
42
42
|
# == X == "execute a command and capture the output"
|
43
43
|
#
|
44
|
-
# Net::SSH.start("host", "user", :
|
44
|
+
# Net::SSH.start("host", "user", password: "password") do |ssh|
|
45
45
|
# result = ssh.exec!("ls -l")
|
46
46
|
# puts result
|
47
47
|
# end
|
48
48
|
#
|
49
49
|
# == X == "forward connections on a local port to a remote host"
|
50
50
|
#
|
51
|
-
# Net::SSH.start("host", "user", :
|
51
|
+
# Net::SSH.start("host", "user", password: "password") do |ssh|
|
52
52
|
# ssh.forward.local(1234, "www.google.com", 80)
|
53
53
|
# ssh.loop { true }
|
54
54
|
# end
|
55
55
|
#
|
56
56
|
# == X == "forward connections on a remote port to the local host"
|
57
57
|
#
|
58
|
-
# Net::SSH.start("host", "user", :
|
58
|
+
# Net::SSH.start("host", "user", password: "password") do |ssh|
|
59
59
|
# ssh.forward.remote(80, "www.google.com", 1234)
|
60
60
|
# ssh.loop { true }
|
61
61
|
# end
|
@@ -154,8 +154,8 @@ module Net
|
|
154
154
|
# * :max_win_size => maximum size we tell the other side that is supported for
|
155
155
|
# the window.
|
156
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.
|
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
159
|
# asking for password.
|
160
160
|
# * :paranoid => either false, true, :very, or :secure specifying how
|
161
161
|
# strict host-key verification should be (in increasing order here).
|
@@ -208,13 +208,7 @@ module Net
|
|
208
208
|
end
|
209
209
|
|
210
210
|
assign_defaults(options)
|
211
|
-
|
212
|
-
options.delete(:password) if options.key?(:password) && options[:password].nil?
|
213
|
-
|
214
|
-
if options.values.include? nil
|
215
|
-
nil_options = options.keys.select { |k| options[k].nil? }
|
216
|
-
raise ArgumentError, "Value(s) have been set to nil: #{nil_options.join(', ')}"
|
217
|
-
end
|
211
|
+
_sanitize_options(options)
|
218
212
|
|
219
213
|
options[:user] = user if user
|
220
214
|
options = configuration_for(host, options.fetch(:config, true)).merge(options)
|
@@ -226,7 +220,7 @@ module Net
|
|
226
220
|
|
227
221
|
if options[:verbose]
|
228
222
|
options[:logger].level = case options[:verbose]
|
229
|
-
when
|
223
|
+
when Integer then options[:verbose]
|
230
224
|
when :debug then Logger::DEBUG
|
231
225
|
when :info then Logger::INFO
|
232
226
|
when :warn then Logger::WARN
|
@@ -283,6 +277,19 @@ module Net
|
|
283
277
|
end
|
284
278
|
|
285
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
|
286
292
|
end
|
293
|
+
private_class_method :_sanitize_options
|
287
294
|
end
|
288
295
|
end
|
@@ -108,7 +108,7 @@ module Net
|
|
108
108
|
user_identities.delete(corresponding_user_identity) if corresponding_user_identity
|
109
109
|
|
110
110
|
if !options[:keys_only] || corresponding_user_identity
|
111
|
-
known_identities[key] = { :
|
111
|
+
known_identities[key] = { from: :agent }
|
112
112
|
yield key
|
113
113
|
end
|
114
114
|
end
|
@@ -140,7 +140,7 @@ module Net
|
|
140
140
|
if info[:key].nil? && info[:from] == :file
|
141
141
|
begin
|
142
142
|
info[:key] = KeyFactory.load_private_key(info[:file], options[:passphrase], !options[:non_interactive])
|
143
|
-
rescue
|
143
|
+
rescue OpenSSL::OpenSSLError, Exception => e
|
144
144
|
raise KeyManagerError, "the given identity is known, but the private key could not be loaded: #{e.class} (#{e.message})"
|
145
145
|
end
|
146
146
|
end
|
@@ -208,7 +208,7 @@ module Net
|
|
208
208
|
# Prepared identities from user key_data, preserving their order and sources.
|
209
209
|
def prepare_identities_from_data
|
210
210
|
key_data.map do |data|
|
211
|
-
{ :
|
211
|
+
{ load_from: :data, data: data }
|
212
212
|
end
|
213
213
|
end
|
214
214
|
|
@@ -219,15 +219,15 @@ module Net
|
|
219
219
|
case identity[:load_from]
|
220
220
|
when :pubkey_file
|
221
221
|
key = KeyFactory.load_public_key(identity[:pubkey_file])
|
222
|
-
{ :
|
222
|
+
{ public_key: key, from: :file, file: identity[:privkey_file] }
|
223
223
|
when :privkey_file
|
224
224
|
private_key = KeyFactory.load_private_key(identity[:privkey_file], options[:passphrase], ask_passphrase, options[:password_prompt])
|
225
225
|
key = private_key.send(:public_key)
|
226
|
-
{ :
|
226
|
+
{ public_key: key, from: :file, file: identity[:privkey_file], key: private_key }
|
227
227
|
when :data
|
228
228
|
private_key = KeyFactory.load_data_private_key(identity[:data], options[:passphrase], ask_passphrase, "<key in memory>", options[:password_prompt])
|
229
229
|
key = private_key.send(:public_key)
|
230
|
-
{ :
|
230
|
+
{ public_key: key, from: :key_data, data: identity[:data], key: private_key }
|
231
231
|
else
|
232
232
|
identity
|
233
233
|
end
|
@@ -250,12 +250,15 @@ module Net; module SSH; module Authentication
|
|
250
250
|
psd_information = malloc_ptr(Win::SECURITY_DESCRIPTOR.size)
|
251
251
|
raise_error_if_zero(
|
252
252
|
Win.InitializeSecurityDescriptor(psd_information,
|
253
|
-
Win::REVISION)
|
253
|
+
Win::REVISION)
|
254
|
+
)
|
254
255
|
raise_error_if_zero(
|
255
256
|
Win.SetSecurityDescriptorOwner(psd_information, get_sid_ptr(user),
|
256
|
-
0)
|
257
|
+
0)
|
258
|
+
)
|
257
259
|
raise_error_if_zero(
|
258
|
-
Win.IsValidSecurityDescriptor(psd_information)
|
260
|
+
Win.IsValidSecurityDescriptor(psd_information)
|
261
|
+
)
|
259
262
|
|
260
263
|
sa = Win::SECURITY_ATTRIBUTES.new(to_struct_ptr(malloc_ptr(Win::SECURITY_ATTRIBUTES.size)))
|
261
264
|
sa.nLength = Win::SECURITY_ATTRIBUTES.size
|
@@ -337,7 +340,8 @@ module Net; module SSH; module Authentication
|
|
337
340
|
|
338
341
|
raise_error_if_zero(
|
339
342
|
Win.OpenProcessToken(process_handle, desired_access,
|
340
|
-
ptoken_handle)
|
343
|
+
ptoken_handle)
|
344
|
+
)
|
341
345
|
token_handle = ptr_to_handle(ptoken_handle)
|
342
346
|
return token_handle
|
343
347
|
end
|
@@ -362,7 +366,8 @@ module Net; module SSH; module Authentication
|
|
362
366
|
token_information_class,
|
363
367
|
ptoken_information,
|
364
368
|
ptoken_information.size,
|
365
|
-
preturn_length)
|
369
|
+
preturn_length)
|
370
|
+
)
|
366
371
|
|
367
372
|
return to_token_user(ptoken_information)
|
368
373
|
end
|
@@ -430,8 +435,7 @@ module Net; module SSH; module Authentication
|
|
430
435
|
@output_buffer.read(n)
|
431
436
|
end
|
432
437
|
|
433
|
-
def close
|
434
|
-
end
|
438
|
+
def close; end
|
435
439
|
|
436
440
|
# Packages the given query string and sends it to the pageant
|
437
441
|
# process via the Windows messaging subsystem. The result is
|
data/lib/net/ssh/buffer.rb
CHANGED
@@ -162,7 +162,7 @@ module Net; module SSH
|
|
162
162
|
index = @content.index(pattern, @position) or return nil
|
163
163
|
length = case pattern
|
164
164
|
when String then pattern.length
|
165
|
-
when
|
165
|
+
when Integer then 1
|
166
166
|
when Regexp then $&.length
|
167
167
|
end
|
168
168
|
index && read(index+length)
|
@@ -248,16 +248,29 @@ module Net; module SSH
|
|
248
248
|
case type
|
249
249
|
when /^ssh-dss(-cert-v01@openssh\.com)?$/
|
250
250
|
key = OpenSSL::PKey::DSA.new
|
251
|
-
key.
|
252
|
-
|
253
|
-
|
254
|
-
|
251
|
+
if key.respond_to?(:set_pqg)
|
252
|
+
key.set_pqg(read_bignum, read_bignum, read_bignum)
|
253
|
+
else
|
254
|
+
key.p = read_bignum
|
255
|
+
key.q = read_bignum
|
256
|
+
key.g = read_bignum
|
257
|
+
end
|
258
|
+
if key.respond_to?(:set_key)
|
259
|
+
key.set_key(read_bignum, nil)
|
260
|
+
else
|
261
|
+
key.pub_key = read_bignum
|
262
|
+
end
|
255
263
|
|
256
264
|
when /^ssh-rsa(-cert-v01@openssh\.com)?$/
|
257
265
|
key = OpenSSL::PKey::RSA.new
|
258
|
-
key.
|
259
|
-
|
260
|
-
|
266
|
+
if key.respond_to?(:set_key)
|
267
|
+
e = read_bignum
|
268
|
+
n = read_bignum
|
269
|
+
key.set_key(n, e, nil)
|
270
|
+
else
|
271
|
+
key.e = read_bignum
|
272
|
+
key.n = read_bignum
|
273
|
+
end
|
261
274
|
when /^ssh-ed25519$/
|
262
275
|
Net::SSH::Authentication::ED25519Loader.raiseUnlessLoaded("unsupported key type `#{type}'")
|
263
276
|
key = Net::SSH::Authentication::ED25519::PubKey.read_keyblob(self)
|
data/lib/net/ssh/config.rb
CHANGED
@@ -144,7 +144,7 @@ module Net; module SSH
|
|
144
144
|
def translate(settings)
|
145
145
|
auth_methods = default_auth_methods.clone
|
146
146
|
(auth_methods << 'challenge-response').uniq!
|
147
|
-
ret = settings.inject({:auth_methods
|
147
|
+
ret = settings.inject({auth_methods: auth_methods}) do |hash, (key, value)|
|
148
148
|
case key
|
149
149
|
when 'bindaddress' then
|
150
150
|
hash[:bind_address] = value
|
@@ -280,7 +280,7 @@ module Net; module SSH
|
|
280
280
|
else size.to_i
|
281
281
|
end
|
282
282
|
end
|
283
|
-
|
283
|
+
|
284
284
|
def merge_challenge_response_with_keyboard_interactive(hash)
|
285
285
|
if hash[:auth_methods].include?('challenge-response')
|
286
286
|
hash[:auth_methods].delete('challenge-response')
|
@@ -189,12 +189,12 @@ module Net; module SSH; module Connection
|
|
189
189
|
end
|
190
190
|
|
191
191
|
# A hash of the valid PTY options (see #request_pty).
|
192
|
-
VALID_PTY_OPTIONS = { :
|
193
|
-
:
|
194
|
-
:
|
195
|
-
:
|
196
|
-
:
|
197
|
-
:
|
192
|
+
VALID_PTY_OPTIONS = { term: "xterm",
|
193
|
+
chars_wide: 80,
|
194
|
+
chars_high: 24,
|
195
|
+
pixels_wide: 640,
|
196
|
+
pixels_high: 480,
|
197
|
+
modes: {} }
|
198
198
|
|
199
199
|
# Requests that a pseudo-tty (or "pty") be made available for this channel.
|
200
200
|
# This is useful when you want to invoke and interact with some kind of
|
@@ -68,14 +68,18 @@ module Net; module SSH; module Connection
|
|
68
68
|
|
69
69
|
fired_sessions = {}
|
70
70
|
|
71
|
-
readers
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
71
|
+
if readers
|
72
|
+
readers.each do |reader|
|
73
|
+
session = owners[reader]
|
74
|
+
(fired_sessions[session] ||= {r: [],w: []})[:r] << reader
|
75
|
+
end
|
76
|
+
end
|
77
|
+
if writers
|
78
|
+
writers.each do |writer|
|
79
|
+
session = owners[writer]
|
80
|
+
(fired_sessions[session] ||= {r: [],w: []})[:w] << writer
|
81
|
+
end
|
82
|
+
end
|
79
83
|
|
80
84
|
fired_sessions.each do |s,rw|
|
81
85
|
s.ev_do_handle_events(rw[:r],rw[:w])
|
@@ -78,8 +78,8 @@ module Net; module SSH; module Connection
|
|
78
78
|
@on_global_request = {}
|
79
79
|
@properties = (options[:properties] || {}).dup
|
80
80
|
|
81
|
-
@max_pkt_size = (options.
|
82
|
-
@max_win_size = (options.
|
81
|
+
@max_pkt_size = (options.key?(:max_pkt_size) ? options[:max_pkt_size] : 0x8000)
|
82
|
+
@max_win_size = (options.key?(:max_win_size) ? options[:max_win_size] : 0x20000)
|
83
83
|
|
84
84
|
@keepalive = Keepalive.new(self)
|
85
85
|
|
data/lib/net/ssh/errors.rb
CHANGED
@@ -5,14 +5,14 @@ module Net; module SSH
|
|
5
5
|
|
6
6
|
# This exception is raised when authentication fails (whether it be
|
7
7
|
# public key authentication, password authentication, or whatever).
|
8
|
-
class AuthenticationFailed < Exception; end
|
8
|
+
class AuthenticationFailed < Net::SSH::Exception; end
|
9
9
|
|
10
10
|
# This exception is raised when a connection attempt times out.
|
11
|
-
class ConnectionTimeout < Exception; end
|
11
|
+
class ConnectionTimeout < Net::SSH::Exception; end
|
12
12
|
|
13
13
|
# This exception is raised when the remote host has disconnected
|
14
14
|
# unexpectedly.
|
15
|
-
class Disconnect < Exception; end
|
15
|
+
class Disconnect < Net::SSH::Exception; end
|
16
16
|
|
17
17
|
# This exception is raised when the remote host has disconnected/
|
18
18
|
# timeouted unexpectedly.
|
@@ -23,14 +23,14 @@ module Net; module SSH
|
|
23
23
|
# want to fail in such a way that the server knows it failed, you can
|
24
24
|
# raise this exception in the handler and Net::SSH will translate that into
|
25
25
|
# a "channel failure" message.
|
26
|
-
class ChannelRequestFailed < Exception; end
|
26
|
+
class ChannelRequestFailed < Net::SSH::Exception; end
|
27
27
|
|
28
28
|
# This is exception is primarily used internally, but if you have a channel
|
29
29
|
# open handler (see Net::SSH::Connection::Session#on_open_channel) and you
|
30
30
|
# want to fail in such a way that the server knows it failed, you can
|
31
31
|
# raise this exception in the handler and Net::SSH will translate that into
|
32
32
|
# a "channel open failed" message.
|
33
|
-
class ChannelOpenFailed < Exception
|
33
|
+
class ChannelOpenFailed < Net::SSH::Exception
|
34
34
|
attr_reader :code, :reason
|
35
35
|
|
36
36
|
def initialize(code, reason)
|
@@ -42,7 +42,7 @@ module Net; module SSH
|
|
42
42
|
# Base class for host key exceptions. When rescuing this exception, you can
|
43
43
|
# inspect the key fingerprint and, if you want to proceed anyway, simply call
|
44
44
|
# the remember_host! method on the exception, and then retry.
|
45
|
-
class HostKeyError < Exception
|
45
|
+
class HostKeyError < Net::SSH::Exception
|
46
46
|
# the callback to use when #remember_host! is called
|
47
47
|
attr_writer :callback #:nodoc:
|
48
48
|
|