net-ssh 4.1.0.beta1 → 4.1.0.rc1
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.travis.yml +5 -0
- data/CHANGES.txt +5 -0
- data/lib/net/ssh/authentication/agent.rb +2 -2
- data/lib/net/ssh/config.rb +89 -87
- data/lib/net/ssh/connection/channel.rb +2 -2
- data/lib/net/ssh/proxy/jump.rb +53 -0
- data/lib/net/ssh/transport/algorithms.rb +2 -2
- data/lib/net/ssh/transport/session.rb +1 -1
- data/lib/net/ssh/version.rb +1 -1
- metadata +3 -2
- metadata.gz.sig +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8e122ba1d132741655fe9c8eef7c1944fbe32da
|
4
|
+
data.tar.gz: f51ce5fc9dbe822a5b0841d8c557dc51dfa45bf4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36a6fe3552dd86088280b12d59c725448a677b778709bada2bed8b1ede1660b29ea0018aace99d288ab8231e4f60fa9f2a4826b969218f4d6e646f46e60402e2
|
7
|
+
data.tar.gz: 4f3129e8b6521debd7810977089cfb6fafb5bcff397cae1f045c673bac30157e9aa0be3e3fd722602975b44272af198e3238c70afddcd0a42b21710e307b55dd
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/.travis.yml
CHANGED
@@ -2,6 +2,10 @@ language: ruby
|
|
2
2
|
sudo: true
|
3
3
|
dist: trusty
|
4
4
|
|
5
|
+
addon:
|
6
|
+
hosts:
|
7
|
+
gateway.netssh
|
8
|
+
|
5
9
|
rvm:
|
6
10
|
- 2.0
|
7
11
|
- 2.1
|
@@ -40,6 +44,7 @@ install:
|
|
40
44
|
- ansible-playbook ./test/integration/playbook.yml -i "localhost," --become -c local -e 'no_rvm=true' -e 'myuser=travis' -e 'mygroup=travis' -e 'homedir=/home/travis'
|
41
45
|
|
42
46
|
script:
|
47
|
+
- ssh -V
|
43
48
|
- bundle _1.13.7_ exec rake test
|
44
49
|
- BUNDLE_GEMFILE=./Gemfile.norbnacl bundle _1.13.7_ exec rake test
|
45
50
|
- bundle _1.13.7_ exec rake test_test
|
data/CHANGES.txt
CHANGED
@@ -79,7 +79,7 @@ module Net; module SSH; module Authentication
|
|
79
79
|
@socket =
|
80
80
|
if agent_socket_factory
|
81
81
|
agent_socket_factory.call
|
82
|
-
elsif ENV['SSH_AUTH_SOCK'] &&
|
82
|
+
elsif ENV['SSH_AUTH_SOCK'] && unix_socket_class
|
83
83
|
unix_socket_class.open(ENV['SSH_AUTH_SOCK'])
|
84
84
|
elsif Gem.win_platform? && RUBY_ENGINE != "jruby"
|
85
85
|
Pageant::Socket.open
|
@@ -181,7 +181,7 @@ module Net; module SSH; module Authentication
|
|
181
181
|
private
|
182
182
|
|
183
183
|
def unix_socket_class
|
184
|
-
UNIXSocket
|
184
|
+
defined?(UNIXSocket) && UNIXSocket
|
185
185
|
end
|
186
186
|
|
187
187
|
# Send a new packet of the given type, with the associated data.
|
data/lib/net/ssh/config.rb
CHANGED
@@ -27,6 +27,7 @@ module Net; module SSH
|
|
27
27
|
# * Port => :port
|
28
28
|
# * PreferredAuthentications => maps to the :auth_methods option
|
29
29
|
# * ProxyCommand => maps to the :proxy option
|
30
|
+
# * ProxyJump => maps to the :proxy option
|
30
31
|
# * PubKeyAuthentication => maps to the :auth_methods option
|
31
32
|
# * RekeyLimit => :rekey_limit
|
32
33
|
# * User => :user
|
@@ -156,93 +157,7 @@ module Net; module SSH
|
|
156
157
|
auth_methods = default_auth_methods.clone
|
157
158
|
(auth_methods << 'challenge-response').uniq!
|
158
159
|
ret = settings.inject({auth_methods: auth_methods}) do |hash, (key, value)|
|
159
|
-
|
160
|
-
when 'bindaddress' then
|
161
|
-
hash[:bind_address] = value
|
162
|
-
when 'ciphers' then
|
163
|
-
hash[:encryption] = value.split(/,/)
|
164
|
-
when 'compression' then
|
165
|
-
hash[:compression] = value
|
166
|
-
when 'compressionlevel' then
|
167
|
-
hash[:compression_level] = value
|
168
|
-
when 'connecttimeout' then
|
169
|
-
hash[:timeout] = value
|
170
|
-
when 'forwardagent' then
|
171
|
-
hash[:forward_agent] = value
|
172
|
-
when 'identitiesonly' then
|
173
|
-
hash[:keys_only] = value
|
174
|
-
when 'globalknownhostsfile'
|
175
|
-
hash[:global_known_hosts_file] = value
|
176
|
-
when 'hostbasedauthentication' then
|
177
|
-
if value
|
178
|
-
(hash[:auth_methods] << "hostbased").uniq!
|
179
|
-
else
|
180
|
-
hash[:auth_methods].delete("hostbased")
|
181
|
-
end
|
182
|
-
when 'hostkeyalgorithms' then
|
183
|
-
hash[:host_key] = value.split(/,/)
|
184
|
-
when 'hostkeyalias' then
|
185
|
-
hash[:host_key_alias] = value
|
186
|
-
when 'hostname' then
|
187
|
-
hash[:host_name] = value.gsub(/%h/, settings['host'])
|
188
|
-
when 'identityfile' then
|
189
|
-
hash[:keys] = value
|
190
|
-
when 'macs' then
|
191
|
-
hash[:hmac] = value.split(/,/)
|
192
|
-
when 'serveralivecountmax'
|
193
|
-
hash[:keepalive_maxcount] = value.to_i if value
|
194
|
-
when 'serveraliveinterval'
|
195
|
-
if value && value.to_i > 0
|
196
|
-
hash[:keepalive] = true
|
197
|
-
hash[:keepalive_interval] = value.to_i
|
198
|
-
else
|
199
|
-
hash[:keepalive] = false
|
200
|
-
end
|
201
|
-
when 'passwordauthentication'
|
202
|
-
if value
|
203
|
-
(hash[:auth_methods] << 'password').uniq!
|
204
|
-
else
|
205
|
-
hash[:auth_methods].delete('password')
|
206
|
-
end
|
207
|
-
when 'challengeresponseauthentication'
|
208
|
-
if value
|
209
|
-
(hash[:auth_methods] << 'challenge-response').uniq!
|
210
|
-
else
|
211
|
-
hash[:auth_methods].delete('challenge-response')
|
212
|
-
end
|
213
|
-
when 'kbdinteractiveauthentication'
|
214
|
-
if value
|
215
|
-
(hash[:auth_methods] << 'keyboard-interactive').uniq!
|
216
|
-
else
|
217
|
-
hash[:auth_methods].delete('keyboard-interactive')
|
218
|
-
end
|
219
|
-
when 'port'
|
220
|
-
hash[:port] = value
|
221
|
-
when 'preferredauthentications'
|
222
|
-
hash[:auth_methods] = value.split(/,/) # TODO we should place to preferred_auth_methods rather than auth_methods
|
223
|
-
when 'proxycommand'
|
224
|
-
if value and !(value =~ /^none$/)
|
225
|
-
require 'net/ssh/proxy/command'
|
226
|
-
hash[:proxy] = Net::SSH::Proxy::Command.new(value)
|
227
|
-
end
|
228
|
-
when 'pubkeyauthentication'
|
229
|
-
if value
|
230
|
-
(hash[:auth_methods] << 'publickey').uniq!
|
231
|
-
else
|
232
|
-
hash[:auth_methods].delete('publickey')
|
233
|
-
end
|
234
|
-
when 'rekeylimit'
|
235
|
-
hash[:rekey_limit] = interpret_size(value)
|
236
|
-
when 'user'
|
237
|
-
hash[:user] = value
|
238
|
-
when 'userknownhostsfile'
|
239
|
-
hash[:user_known_hosts_file] = value
|
240
|
-
when 'sendenv'
|
241
|
-
multi_send_env = value.to_s.split(/\s+/)
|
242
|
-
hash[:send_env] = multi_send_env.map { |e| Regexp.new pattern2regex(e).source, false }
|
243
|
-
when 'numberofpasswordprompts'
|
244
|
-
hash[:number_of_password_prompts] = value.to_i
|
245
|
-
end
|
160
|
+
translate_config_key(hash, key.to_sym, value, settings)
|
246
161
|
hash
|
247
162
|
end
|
248
163
|
merge_challenge_response_with_keyboard_interactive(ret)
|
@@ -262,6 +177,93 @@ module Net; module SSH
|
|
262
177
|
|
263
178
|
private
|
264
179
|
|
180
|
+
def translate_config_key(hash, key, value, settings)
|
181
|
+
rename = {
|
182
|
+
bindaddress: :bind_address,
|
183
|
+
compression: :compression,
|
184
|
+
compressionlevel: :compression_level,
|
185
|
+
connecttimeout: :timeout,
|
186
|
+
forwardagent: :forward_agent,
|
187
|
+
identitiesonly: :keys_only,
|
188
|
+
globalknownhostsfile: :global_known_hosts_file,
|
189
|
+
hostkeyalias: :host_key_alias,
|
190
|
+
identityfile: :keys,
|
191
|
+
port: :port,
|
192
|
+
user: :user,
|
193
|
+
userknownhostsfile: :user_known_hosts_file
|
194
|
+
}
|
195
|
+
case key
|
196
|
+
when :ciphers
|
197
|
+
hash[:encryption] = value.split(/,/)
|
198
|
+
when :hostbasedauthentication
|
199
|
+
if value
|
200
|
+
(hash[:auth_methods] << "hostbased").uniq!
|
201
|
+
else
|
202
|
+
hash[:auth_methods].delete("hostbased")
|
203
|
+
end
|
204
|
+
when :hostkeyalgorithms
|
205
|
+
hash[:host_key] = value.split(/,/)
|
206
|
+
when :hostname
|
207
|
+
hash[:host_name] = value.gsub(/%h/, settings['host'])
|
208
|
+
when :macs
|
209
|
+
hash[:hmac] = value.split(/,/)
|
210
|
+
when :serveralivecountmax
|
211
|
+
hash[:keepalive_maxcount] = value.to_i if value
|
212
|
+
when :serveraliveinterval
|
213
|
+
if value && value.to_i > 0
|
214
|
+
hash[:keepalive] = true
|
215
|
+
hash[:keepalive_interval] = value.to_i
|
216
|
+
else
|
217
|
+
hash[:keepalive] = false
|
218
|
+
end
|
219
|
+
when :passwordauthentication
|
220
|
+
if value
|
221
|
+
(hash[:auth_methods] << 'password').uniq!
|
222
|
+
else
|
223
|
+
hash[:auth_methods].delete('password')
|
224
|
+
end
|
225
|
+
when :challengeresponseauthentication
|
226
|
+
if value
|
227
|
+
(hash[:auth_methods] << 'challenge-response').uniq!
|
228
|
+
else
|
229
|
+
hash[:auth_methods].delete('challenge-response')
|
230
|
+
end
|
231
|
+
when :kbdinteractiveauthentication
|
232
|
+
if value
|
233
|
+
(hash[:auth_methods] << 'keyboard-interactive').uniq!
|
234
|
+
else
|
235
|
+
hash[:auth_methods].delete('keyboard-interactive')
|
236
|
+
end
|
237
|
+
when :preferredauthentications
|
238
|
+
hash[:auth_methods] = value.split(/,/) # TODO we should place to preferred_auth_methods rather than auth_methods
|
239
|
+
when :proxycommand
|
240
|
+
if value and !(value =~ /^none$/)
|
241
|
+
require 'net/ssh/proxy/command'
|
242
|
+
hash[:proxy] = Net::SSH::Proxy::Command.new(value)
|
243
|
+
end
|
244
|
+
when :proxyjump
|
245
|
+
if value
|
246
|
+
require 'net/ssh/proxy/jump'
|
247
|
+
hash[:proxy] = Net::SSH::Proxy::Jump.new(value)
|
248
|
+
end
|
249
|
+
when :pubkeyauthentication
|
250
|
+
if value
|
251
|
+
(hash[:auth_methods] << 'publickey').uniq!
|
252
|
+
else
|
253
|
+
hash[:auth_methods].delete('publickey')
|
254
|
+
end
|
255
|
+
when :rekeylimit
|
256
|
+
hash[:rekey_limit] = interpret_size(value)
|
257
|
+
when :sendenv
|
258
|
+
multi_send_env = value.to_s.split(/\s+/)
|
259
|
+
hash[:send_env] = multi_send_env.map { |e| Regexp.new pattern2regex(e).source, false }
|
260
|
+
when :numberofpasswordprompts
|
261
|
+
hash[:number_of_password_prompts] = value.to_i
|
262
|
+
when *rename.keys
|
263
|
+
hash[rename[key]] = value
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
265
267
|
# Converts an ssh_config pattern into a regex for matching against
|
266
268
|
# host names.
|
267
269
|
def pattern2regex(pattern)
|
@@ -613,7 +613,7 @@ module Net; module SSH; module Connection
|
|
613
613
|
if callback = pending_requests.shift
|
614
614
|
callback.call(self, false)
|
615
615
|
else
|
616
|
-
error { "channel failure
|
616
|
+
error { "channel failure received with no pending request to handle it (bug?)" }
|
617
617
|
end
|
618
618
|
end
|
619
619
|
|
@@ -623,7 +623,7 @@ module Net; module SSH; module Connection
|
|
623
623
|
if callback = pending_requests.shift
|
624
624
|
callback.call(self, true)
|
625
625
|
else
|
626
|
-
error { "channel success
|
626
|
+
error { "channel success received with no pending request to handle it (bug?)" }
|
627
627
|
end
|
628
628
|
end
|
629
629
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/ssh/proxy/command'
|
3
|
+
|
4
|
+
module Net; module SSH; module Proxy
|
5
|
+
|
6
|
+
# An implementation of a jump proxy. To use it, instantiate it,
|
7
|
+
# then pass the instantiated object via the :proxy key to
|
8
|
+
# Net::SSH.start:
|
9
|
+
#
|
10
|
+
# require 'net/ssh/proxy/jump'
|
11
|
+
#
|
12
|
+
# proxy = Net::SSH::Proxy::Jump.new('user@proxy')
|
13
|
+
# Net::SSH.start('host', 'user', :proxy => proxy) do |ssh|
|
14
|
+
# ...
|
15
|
+
# end
|
16
|
+
class Jump < Command
|
17
|
+
|
18
|
+
# The jump proxies
|
19
|
+
attr_reader :jump_proxies
|
20
|
+
|
21
|
+
# Create a new socket factory that tunnels via multiple jump proxes as
|
22
|
+
# [user@]host[:port].
|
23
|
+
def initialize(jump_proxies)
|
24
|
+
@jump_proxies = jump_proxies
|
25
|
+
end
|
26
|
+
|
27
|
+
# Return a new socket connected to the given host and port via the jump
|
28
|
+
# proxy that was requested when the socket factory was instantiated.
|
29
|
+
def open(host, port, connection_options = nil)
|
30
|
+
build_proxy_command_equivalent(connection_options)
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
# We cannot build the ProxyCommand template until we know if the :config
|
35
|
+
# option was specified during `Net::SSH.start`.
|
36
|
+
def build_proxy_command_equivalent(connection_options = nil)
|
37
|
+
first_jump, extra_jumps = jump_proxies.split(",", 2)
|
38
|
+
config = connection_options && connection_options[:config]
|
39
|
+
uri = URI.parse("ssh://#{first_jump}")
|
40
|
+
|
41
|
+
template = "ssh"
|
42
|
+
template << " -l #{uri.user}" if uri.user
|
43
|
+
template << " -p #{uri.port}" if uri.port
|
44
|
+
template << " -J #{extra_jumps}" if extra_jumps
|
45
|
+
template << " -F #{config}" if config != true && config
|
46
|
+
template << " -W %h:%p "
|
47
|
+
template << uri.host
|
48
|
+
|
49
|
+
@command_line_template = template
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end; end; end
|
@@ -121,7 +121,7 @@ module Net; module SSH; module Transport
|
|
121
121
|
|
122
122
|
# Start the algorithm negotation
|
123
123
|
def start
|
124
|
-
raise ArgumentError, "Cannot call start if it's
|
124
|
+
raise ArgumentError, "Cannot call start if it's negotiation started or done" if @pending || @initialized
|
125
125
|
send_kexinit
|
126
126
|
end
|
127
127
|
|
@@ -135,7 +135,7 @@ module Net; module SSH; module Transport
|
|
135
135
|
send_kexinit
|
136
136
|
end
|
137
137
|
|
138
|
-
# Called by the transport layer when a KEXINIT packet is
|
138
|
+
# Called by the transport layer when a KEXINIT packet is received, indicating
|
139
139
|
# that the server wants to exchange keys. This can be spontaneous, or it
|
140
140
|
# can be in response to a client-initiated rekey request (see #rekey!). Either
|
141
141
|
# way, this will block until the key exchange completes.
|
@@ -198,7 +198,7 @@ module Net; module SSH; module Transport
|
|
198
198
|
raise Net::SSH::Disconnect, "disconnected: #{packet[:description]} (#{packet[:reason_code]})"
|
199
199
|
|
200
200
|
when IGNORE
|
201
|
-
debug { "IGNORE packet
|
201
|
+
debug { "IGNORE packet received: #{packet[:data].inspect}" }
|
202
202
|
|
203
203
|
when UNIMPLEMENTED
|
204
204
|
lwarn { "UNIMPLEMENTED: #{packet[:number]}" }
|
data/lib/net/ssh/version.rb
CHANGED
@@ -55,7 +55,7 @@ module Net; module SSH
|
|
55
55
|
|
56
56
|
# The prerelease component of this version of the Net::SSH library
|
57
57
|
# nil allowed
|
58
|
-
PRE = "
|
58
|
+
PRE = "rc1"
|
59
59
|
|
60
60
|
# The current version of the Net::SSH library as a Version instance
|
61
61
|
CURRENT = new(*[MAJOR, MINOR, TINY, PRE].compact)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-ssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.0.
|
4
|
+
version: 4.1.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamis Buck
|
@@ -32,7 +32,7 @@ cert_chain:
|
|
32
32
|
L4d54WIy4HkZCqQXoTSiK5HZMIdXkPk3F1bZdJ8Dy1sMRru0rUkkM5mW7TQ75mfW
|
33
33
|
Zp0QrZyNZhtitrXFbZneGRrIA/8G2Krft5Ly/A==
|
34
34
|
-----END CERTIFICATE-----
|
35
|
-
date: 2017-
|
35
|
+
date: 2017-02-15 00:00:00.000000000 Z
|
36
36
|
dependencies:
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,6 +198,7 @@ files:
|
|
198
198
|
- lib/net/ssh/proxy/errors.rb
|
199
199
|
- lib/net/ssh/proxy/http.rb
|
200
200
|
- lib/net/ssh/proxy/https.rb
|
201
|
+
- lib/net/ssh/proxy/jump.rb
|
201
202
|
- lib/net/ssh/proxy/socks4.rb
|
202
203
|
- lib/net/ssh/proxy/socks5.rb
|
203
204
|
- lib/net/ssh/ruby_compat.rb
|
metadata.gz.sig
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
�C�� e-��w@*���-QW}0�d�c>�˭+:�<�xY�g��O��ge����/ �U����V��0ڤfO)S��z�
|
2
|
+
�.C ��
|