net-ssh 5.2.0 → 7.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data/.dockerignore +6 -0
- data/.github/config/rubocop_linter_action.yml +4 -0
- data/.github/workflows/ci-with-docker.yml +44 -0
- data/.github/workflows/ci.yml +87 -0
- data/.github/workflows/rubocop.yml +13 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +16 -2
- data/.rubocop_todo.yml +623 -511
- data/CHANGES.txt +50 -2
- data/Dockerfile +27 -0
- data/Dockerfile.openssl3 +17 -0
- data/Gemfile +2 -0
- data/Gemfile.noed25519 +2 -0
- data/Manifest +0 -1
- data/README.md +293 -0
- data/Rakefile +6 -2
- data/appveyor.yml +4 -2
- data/docker-compose.yml +23 -0
- data/lib/net/ssh/authentication/agent.rb +29 -13
- data/lib/net/ssh/authentication/certificate.rb +19 -7
- data/lib/net/ssh/authentication/constants.rb +0 -1
- data/lib/net/ssh/authentication/ed25519.rb +13 -8
- data/lib/net/ssh/authentication/ed25519_loader.rb +5 -8
- data/lib/net/ssh/authentication/key_manager.rb +73 -32
- data/lib/net/ssh/authentication/methods/abstract.rb +12 -3
- data/lib/net/ssh/authentication/methods/hostbased.rb +3 -5
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +5 -3
- data/lib/net/ssh/authentication/methods/none.rb +6 -9
- data/lib/net/ssh/authentication/methods/password.rb +2 -3
- data/lib/net/ssh/authentication/methods/publickey.rb +56 -16
- data/lib/net/ssh/authentication/pageant.rb +97 -97
- data/lib/net/ssh/authentication/pub_key_fingerprint.rb +2 -3
- data/lib/net/ssh/authentication/session.rb +27 -23
- data/lib/net/ssh/buffer.rb +51 -40
- data/lib/net/ssh/buffered_io.rb +24 -26
- data/lib/net/ssh/config.rb +82 -50
- data/lib/net/ssh/connection/channel.rb +101 -87
- data/lib/net/ssh/connection/constants.rb +0 -4
- data/lib/net/ssh/connection/event_loop.rb +30 -25
- data/lib/net/ssh/connection/keepalive.rb +12 -12
- data/lib/net/ssh/connection/session.rb +115 -111
- data/lib/net/ssh/connection/term.rb +56 -58
- data/lib/net/ssh/errors.rb +12 -12
- data/lib/net/ssh/key_factory.rb +10 -13
- data/lib/net/ssh/known_hosts.rb +106 -39
- data/lib/net/ssh/loggable.rb +10 -11
- data/lib/net/ssh/packet.rb +1 -1
- data/lib/net/ssh/prompt.rb +9 -11
- data/lib/net/ssh/proxy/command.rb +1 -2
- data/lib/net/ssh/proxy/errors.rb +2 -4
- data/lib/net/ssh/proxy/http.rb +18 -20
- data/lib/net/ssh/proxy/https.rb +8 -10
- data/lib/net/ssh/proxy/jump.rb +8 -10
- data/lib/net/ssh/proxy/socks4.rb +2 -4
- data/lib/net/ssh/proxy/socks5.rb +3 -6
- data/lib/net/ssh/service/forward.rb +9 -8
- data/lib/net/ssh/test/channel.rb +24 -26
- data/lib/net/ssh/test/extensions.rb +35 -35
- data/lib/net/ssh/test/kex.rb +6 -8
- data/lib/net/ssh/test/local_packet.rb +0 -2
- data/lib/net/ssh/test/packet.rb +3 -3
- data/lib/net/ssh/test/remote_packet.rb +6 -8
- data/lib/net/ssh/test/script.rb +25 -27
- data/lib/net/ssh/test/socket.rb +12 -15
- data/lib/net/ssh/test.rb +7 -7
- data/lib/net/ssh/transport/algorithms.rb +100 -58
- data/lib/net/ssh/transport/cipher_factory.rb +34 -50
- data/lib/net/ssh/transport/constants.rb +13 -9
- data/lib/net/ssh/transport/ctr.rb +8 -14
- data/lib/net/ssh/transport/hmac/abstract.rb +20 -5
- 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 +13 -11
- data/lib/net/ssh/transport/identity_cipher.rb +11 -13
- 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 +5 -19
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +30 -139
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +1 -8
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +20 -81
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +5 -4
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +5 -4
- data/lib/net/ssh/transport/kex.rb +15 -10
- data/lib/net/ssh/transport/key_expander.rb +7 -8
- data/lib/net/ssh/transport/openssl.rb +149 -127
- data/lib/net/ssh/transport/packet_stream.rb +50 -16
- data/lib/net/ssh/transport/server_version.rb +17 -16
- data/lib/net/ssh/transport/session.rb +9 -7
- data/lib/net/ssh/transport/state.rb +44 -44
- data/lib/net/ssh/verifiers/accept_new.rb +0 -2
- data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +1 -2
- data/lib/net/ssh/verifiers/always.rb +6 -4
- data/lib/net/ssh/verifiers/never.rb +0 -2
- data/lib/net/ssh/version.rb +3 -3
- data/lib/net/ssh.rb +12 -8
- data/net-ssh-public_cert.pem +8 -8
- data/net-ssh.gemspec +9 -7
- data/support/ssh_tunnel_bug.rb +3 -3
- data.tar.gz.sig +0 -0
- metadata +55 -30
- metadata.gz.sig +0 -0
- data/.travis.yml +0 -53
- data/Gemfile.noed25519.lock +0 -41
- data/README.rdoc +0 -194
- data/lib/net/ssh/ruby_compat.rb +0 -13
- data/support/arcfour_check.rb +0 -20
@@ -2,10 +2,9 @@ require 'zlib'
|
|
2
2
|
require 'net/ssh/transport/cipher_factory'
|
3
3
|
require 'net/ssh/transport/hmac'
|
4
4
|
|
5
|
-
module Net
|
6
|
-
module SSH
|
5
|
+
module Net
|
6
|
+
module SSH
|
7
7
|
module Transport
|
8
|
-
|
9
8
|
# Encapsulates state information about one end of an SSH connection. Such
|
10
9
|
# state includes the packet sequence number, the algorithms in use, how
|
11
10
|
# many packets and blocks have been processed since the last reset, and so
|
@@ -14,46 +13,46 @@ module Net
|
|
14
13
|
class State
|
15
14
|
# The socket object that owns this state object.
|
16
15
|
attr_reader :socket
|
17
|
-
|
16
|
+
|
18
17
|
# The next packet sequence number for this socket endpoint.
|
19
18
|
attr_reader :sequence_number
|
20
|
-
|
19
|
+
|
21
20
|
# The hmac algorithm in use for this endpoint.
|
22
21
|
attr_reader :hmac
|
23
|
-
|
22
|
+
|
24
23
|
# The compression algorithm in use for this endpoint.
|
25
24
|
attr_reader :compression
|
26
|
-
|
25
|
+
|
27
26
|
# The compression level to use when compressing data (or nil, for the default).
|
28
27
|
attr_reader :compression_level
|
29
|
-
|
28
|
+
|
30
29
|
# The number of packets processed since the last call to #reset!
|
31
30
|
attr_reader :packets
|
32
|
-
|
31
|
+
|
33
32
|
# The number of data blocks processed since the last call to #reset!
|
34
33
|
attr_reader :blocks
|
35
|
-
|
34
|
+
|
36
35
|
# The cipher algorithm in use for this socket endpoint.
|
37
36
|
attr_reader :cipher
|
38
|
-
|
37
|
+
|
39
38
|
# The block size for the cipher
|
40
39
|
attr_reader :block_size
|
41
|
-
|
40
|
+
|
42
41
|
# The role that this state plays (either :client or :server)
|
43
42
|
attr_reader :role
|
44
|
-
|
43
|
+
|
45
44
|
# The maximum number of packets that this endpoint wants to process before
|
46
45
|
# needing a rekey.
|
47
46
|
attr_accessor :max_packets
|
48
|
-
|
47
|
+
|
49
48
|
# The maximum number of blocks that this endpoint wants to process before
|
50
49
|
# needing a rekey.
|
51
50
|
attr_accessor :max_blocks
|
52
|
-
|
51
|
+
|
53
52
|
# The user-specified maximum number of bytes that this endpoint ought to
|
54
53
|
# process before needing a rekey.
|
55
54
|
attr_accessor :rekey_limit
|
56
|
-
|
55
|
+
|
57
56
|
# Creates a new state object, belonging to the given socket. Initializes
|
58
57
|
# the algorithms to "none".
|
59
58
|
def initialize(socket, role)
|
@@ -65,9 +64,9 @@ module Net
|
|
65
64
|
@hmac = HMAC.get("none")
|
66
65
|
@compression = nil
|
67
66
|
@compressor = @decompressor = nil
|
68
|
-
@next_iv =
|
67
|
+
@next_iv = String.new
|
69
68
|
end
|
70
|
-
|
69
|
+
|
71
70
|
# A convenience method for quickly setting multiple values in a single
|
72
71
|
# command.
|
73
72
|
def set(values)
|
@@ -76,19 +75,19 @@ module Net
|
|
76
75
|
end
|
77
76
|
reset!
|
78
77
|
end
|
79
|
-
|
78
|
+
|
80
79
|
def update_cipher(data)
|
81
80
|
result = cipher.update(data)
|
82
81
|
update_next_iv(role == :client ? result : data)
|
83
82
|
return result
|
84
83
|
end
|
85
|
-
|
84
|
+
|
86
85
|
def final_cipher
|
87
86
|
result = cipher.final
|
88
87
|
update_next_iv(role == :client ? result : "", true)
|
89
88
|
return result
|
90
89
|
end
|
91
|
-
|
90
|
+
|
92
91
|
# Increments the counters. The sequence number is incremented (and remapped
|
93
92
|
# so it always fits in a 32-bit integer). The number of packets and blocks
|
94
93
|
# are also incremented.
|
@@ -97,18 +96,18 @@ module Net
|
|
97
96
|
@packets += 1
|
98
97
|
@blocks += (packet_length + 4) / @block_size
|
99
98
|
end
|
100
|
-
|
99
|
+
|
101
100
|
# The compressor object to use when compressing data. This takes into account
|
102
101
|
# the desired compression level.
|
103
102
|
def compressor
|
104
103
|
@compressor ||= Zlib::Deflate.new(compression_level || Zlib::DEFAULT_COMPRESSION)
|
105
104
|
end
|
106
|
-
|
105
|
+
|
107
106
|
# The decompressor object to use when decompressing data.
|
108
107
|
def decompressor
|
109
108
|
@decompressor ||= Zlib::Inflate.new(nil)
|
110
109
|
end
|
111
|
-
|
110
|
+
|
112
111
|
# Returns true if data compression/decompression is enabled. This will
|
113
112
|
# return true if :standard compression is selected, or if :delayed
|
114
113
|
# compression is selected and the :authenticated hint has been received
|
@@ -116,33 +115,35 @@ module Net
|
|
116
115
|
def compression?
|
117
116
|
compression == :standard || (compression == :delayed && socket.hints[:authenticated])
|
118
117
|
end
|
119
|
-
|
118
|
+
|
120
119
|
# Compresses the data. If no compression is in effect, this will just return
|
121
120
|
# the data unmodified, otherwise it uses #compressor to compress the data.
|
122
121
|
def compress(data)
|
123
122
|
data = data.to_s
|
124
123
|
return data unless compression?
|
124
|
+
|
125
125
|
compressor.deflate(data, Zlib::SYNC_FLUSH)
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
# Deompresses the data. If no compression is in effect, this will just return
|
129
129
|
# the data unmodified, otherwise it uses #decompressor to decompress the data.
|
130
130
|
def decompress(data)
|
131
131
|
data = data.to_s
|
132
132
|
return data unless compression?
|
133
|
+
|
133
134
|
decompressor.inflate(data)
|
134
135
|
end
|
135
|
-
|
136
|
+
|
136
137
|
# Resets the counters on the state object, but leaves the sequence_number
|
137
138
|
# unchanged. It also sets defaults for and recomputes the max_packets and
|
138
139
|
# max_blocks values.
|
139
140
|
def reset!
|
140
141
|
@packets = @blocks = 0
|
141
|
-
|
142
|
+
|
142
143
|
@max_packets ||= 1 << 31
|
143
|
-
|
144
|
-
@block_size = cipher.
|
145
|
-
|
144
|
+
|
145
|
+
@block_size = cipher.block_size
|
146
|
+
|
146
147
|
if max_blocks.nil?
|
147
148
|
# cargo-culted from openssh. the idea is that "the 2^(blocksize*2)
|
148
149
|
# limit is too expensive for 3DES, blowfish, etc., so enforce a 1GB
|
@@ -152,16 +153,16 @@ module Net
|
|
152
153
|
else
|
153
154
|
@max_blocks = (1 << 30) / @block_size
|
154
155
|
end
|
155
|
-
|
156
|
+
|
156
157
|
# if a limit on the # of bytes has been given, convert that into a
|
157
158
|
# minimum number of blocks processed.
|
158
|
-
|
159
|
+
|
159
160
|
@max_blocks = [@max_blocks, rekey_limit / @block_size].min if rekey_limit
|
160
161
|
end
|
161
|
-
|
162
|
+
|
162
163
|
cleanup
|
163
164
|
end
|
164
|
-
|
165
|
+
|
165
166
|
# Closes any the compressor and/or decompressor objects that have been
|
166
167
|
# instantiated.
|
167
168
|
def cleanup
|
@@ -169,17 +170,17 @@ module Net
|
|
169
170
|
@compressor.finish if !@compressor.finished?
|
170
171
|
@compressor.close
|
171
172
|
end
|
172
|
-
|
173
|
+
|
173
174
|
if @decompressor
|
174
175
|
# we call reset here so that we don't get warnings when we try to
|
175
176
|
# close the decompressor
|
176
177
|
@decompressor.reset
|
177
178
|
@decompressor.close
|
178
179
|
end
|
179
|
-
|
180
|
+
|
180
181
|
@compressor = @decompressor = nil
|
181
182
|
end
|
182
|
-
|
183
|
+
|
183
184
|
# Returns true if the number of packets processed exceeds the maximum
|
184
185
|
# number of packets, or if the number of blocks processed exceeds the
|
185
186
|
# maximum number of blocks.
|
@@ -187,22 +188,21 @@ module Net
|
|
187
188
|
max_packets && packets > max_packets ||
|
188
189
|
max_blocks && blocks > max_blocks
|
189
190
|
end
|
190
|
-
|
191
|
+
|
191
192
|
private
|
192
|
-
|
193
|
-
def update_next_iv(data, reset=false)
|
193
|
+
|
194
|
+
def update_next_iv(data, reset = false)
|
194
195
|
@next_iv << data
|
195
196
|
@next_iv = @next_iv[@next_iv.size - cipher.iv_len..-1]
|
196
|
-
|
197
|
+
|
197
198
|
if reset
|
198
199
|
cipher.reset
|
199
200
|
cipher.iv = @next_iv
|
200
201
|
end
|
201
|
-
|
202
|
+
|
202
203
|
return data
|
203
204
|
end
|
204
205
|
end
|
205
|
-
|
206
206
|
end
|
207
207
|
end
|
208
208
|
end
|
@@ -5,7 +5,6 @@ require 'net/ssh/verifiers/always'
|
|
5
5
|
module Net
|
6
6
|
module SSH
|
7
7
|
module Verifiers
|
8
|
-
|
9
8
|
# Does a strict host verification, looking the server up in the known
|
10
9
|
# host files to see if a key has already been seen for this server. If this
|
11
10
|
# server does not appear in any host file, this will silently add the
|
@@ -29,7 +28,6 @@ module Net
|
|
29
28
|
return true
|
30
29
|
end
|
31
30
|
end
|
32
|
-
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
@@ -3,7 +3,6 @@ require 'net/ssh/verifiers/accept_new'
|
|
3
3
|
module Net
|
4
4
|
module SSH
|
5
5
|
module Verifiers
|
6
|
-
|
7
6
|
# Basically the same as the AcceptNew verifier, but does not try to actually
|
8
7
|
# verify a connection if the server is the localhost and the port is a
|
9
8
|
# nonstandard port number. Those two conditions will typically mean the
|
@@ -14,6 +13,7 @@ module Net
|
|
14
13
|
# returns true. Otherwise, performs the standard strict verification.
|
15
14
|
def verify(arguments)
|
16
15
|
return true if tunnelled?(arguments)
|
16
|
+
|
17
17
|
super
|
18
18
|
end
|
19
19
|
|
@@ -28,7 +28,6 @@ module Net
|
|
28
28
|
return ip == "127.0.0.1" || ip == "::1"
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
32
31
|
end
|
33
32
|
end
|
34
33
|
end
|
@@ -4,7 +4,6 @@ require 'net/ssh/known_hosts'
|
|
4
4
|
module Net
|
5
5
|
module SSH
|
6
6
|
module Verifiers
|
7
|
-
|
8
7
|
# Does a strict host verification, looking the server up in the known
|
9
8
|
# host files to see if a key has already been seen for this server. If this
|
10
9
|
# server does not appear in any host file, an exception will be raised
|
@@ -22,9 +21,13 @@ module Net
|
|
22
21
|
|
23
22
|
# If we found any matches, check to see that the key type and
|
24
23
|
# blob also match.
|
24
|
+
|
25
25
|
found = host_keys.any? do |key|
|
26
|
-
key.
|
27
|
-
|
26
|
+
if key.respond_to?(:matches_key?)
|
27
|
+
key.matches_key?(arguments[:key])
|
28
|
+
else
|
29
|
+
key.ssh_type == arguments[:key].ssh_type && key.to_blob == arguments[:key].to_blob
|
30
|
+
end
|
28
31
|
end
|
29
32
|
|
30
33
|
# If a match was found, return true. Otherwise, raise an exception
|
@@ -50,7 +53,6 @@ module Net
|
|
50
53
|
raise exception
|
51
54
|
end
|
52
55
|
end
|
53
|
-
|
54
56
|
end
|
55
57
|
end
|
56
58
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Net
|
2
2
|
module SSH
|
3
3
|
module Verifiers
|
4
|
-
|
5
4
|
# This host key verifier simply allows every key it sees, without
|
6
5
|
# any verification. This is simple, but very insecure because it
|
7
6
|
# exposes you to MiTM attacks.
|
@@ -15,7 +14,6 @@ module Net
|
|
15
14
|
true
|
16
15
|
end
|
17
16
|
end
|
18
|
-
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
data/lib/net/ssh/version.rb
CHANGED
@@ -46,13 +46,13 @@ module Net
|
|
46
46
|
end
|
47
47
|
|
48
48
|
# The major component of this version of the Net::SSH library
|
49
|
-
MAJOR =
|
49
|
+
MAJOR = 7
|
50
50
|
|
51
51
|
# The minor component of this version of the Net::SSH library
|
52
|
-
MINOR =
|
52
|
+
MINOR = 0
|
53
53
|
|
54
54
|
# The tiny component of this version of the Net::SSH library
|
55
|
-
TINY =
|
55
|
+
TINY = 1
|
56
56
|
|
57
57
|
# The prerelease component of this version of the Net::SSH library
|
58
58
|
# nil allowed
|
data/lib/net/ssh.rb
CHANGED
@@ -4,6 +4,7 @@ ENV['HOME'] ||= ENV['HOMEPATH'] ? "#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}" : Dir.
|
|
4
4
|
|
5
5
|
require 'logger'
|
6
6
|
require 'etc'
|
7
|
+
require 'shellwords'
|
7
8
|
|
8
9
|
require 'net/ssh/config'
|
9
10
|
require 'net/ssh/errors'
|
@@ -14,7 +15,6 @@ require 'net/ssh/connection/session'
|
|
14
15
|
require 'net/ssh/prompt'
|
15
16
|
|
16
17
|
module Net
|
17
|
-
|
18
18
|
# Net::SSH is a library for interacting, programmatically, with remote
|
19
19
|
# processes via the SSH2 protocol. Sessions are always initiated via
|
20
20
|
# Net::SSH.start. From there, a program interacts with the new SSH session
|
@@ -66,11 +66,11 @@ module Net
|
|
66
66
|
auth_methods bind_address compression compression_level config
|
67
67
|
encryption forward_agent hmac host_key remote_user
|
68
68
|
keepalive keepalive_interval keepalive_maxcount kex keys key_data
|
69
|
-
languages logger paranoid password port proxy
|
69
|
+
keycerts languages logger paranoid password port proxy
|
70
70
|
rekey_blocks_limit rekey_limit rekey_packet_limit timeout verbose
|
71
71
|
known_hosts global_known_hosts_file user_known_hosts_file host_key_alias
|
72
72
|
host_name user properties passphrase keys_only max_pkt_size
|
73
|
-
max_win_size send_env use_agent number_of_password_prompts
|
73
|
+
max_win_size send_env set_env use_agent number_of_password_prompts
|
74
74
|
append_all_supported_algorithms non_interactive password_prompt
|
75
75
|
agent_socket_factory minimum_dh_bits verify_host_key
|
76
76
|
fingerprint_hash check_host_ip
|
@@ -121,7 +121,7 @@ module Net
|
|
121
121
|
# * :forward_agent => set to true if you want the SSH agent connection to
|
122
122
|
# be forwarded
|
123
123
|
# * :known_hosts => a custom object holding known hosts records.
|
124
|
-
# It must implement #search_for and add in a similiar manner as KnownHosts.
|
124
|
+
# It must implement #search_for and `add` in a similiar manner as KnownHosts.
|
125
125
|
# * :global_known_hosts_file => the location of the global known hosts
|
126
126
|
# file. Set to an array if you want to specify multiple global known
|
127
127
|
# hosts files. Defaults to %w(/etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2).
|
@@ -144,6 +144,8 @@ module Net
|
|
144
144
|
# * :kex => the key exchange algorithm (or algorithms) to use
|
145
145
|
# * :keys => an array of file names of private keys to use for publickey
|
146
146
|
# and hostbased authentication
|
147
|
+
# * :keycerts => an array of file names of key certificates to use
|
148
|
+
# with publickey authentication
|
147
149
|
# * :key_data => an array of strings, with each element of the array being
|
148
150
|
# a raw private key in PEM format.
|
149
151
|
# * :keys_only => set to +true+ to use only private keys from +keys+ and
|
@@ -173,6 +175,8 @@ module Net
|
|
173
175
|
# * :rekey_packet_limit => the max number of packets to process before rekeying
|
174
176
|
# * :send_env => an array of local environment variable names to export to the
|
175
177
|
# remote environment. Names may be given as String or Regexp.
|
178
|
+
# * :set_env => a hash of environment variable names and values to set to the
|
179
|
+
# remote environment. Override the ones if specified in +send_env+.
|
176
180
|
# * :timeout => how long to wait for the initial connection to be made
|
177
181
|
# * :user => the user name to log in as; this overrides the +user+
|
178
182
|
# parameter, and is primarily only useful when provided via an SSH
|
@@ -210,7 +214,7 @@ module Net
|
|
210
214
|
# * :fingerprint_hash => 'MD5' or 'SHA256', defaults to 'SHA256'
|
211
215
|
# If +user+ parameter is nil it defaults to USER from ssh_config, or
|
212
216
|
# local username
|
213
|
-
def self.start(host, user=nil, options={}, &block)
|
217
|
+
def self.start(host, user = nil, options = {}, &block)
|
214
218
|
invalid_options = options.keys - VALID_OPTIONS
|
215
219
|
if invalid_options.any?
|
216
220
|
raise ArgumentError, "invalid option(s): #{invalid_options.join(', ')}"
|
@@ -246,7 +250,7 @@ module Net
|
|
246
250
|
transport = Transport::Session.new(host, options)
|
247
251
|
auth = Authentication::Session.new(transport, options)
|
248
252
|
|
249
|
-
user = options.fetch(:user, user) || Etc.
|
253
|
+
user = options.fetch(:user, user) || Etc.getpwuid.name
|
250
254
|
if auth.authenticate("ssh-connection", user, options[:password])
|
251
255
|
connection = Connection::Session.new(transport, options)
|
252
256
|
if block_given?
|
@@ -297,9 +301,9 @@ module Net
|
|
297
301
|
end
|
298
302
|
|
299
303
|
def self._sanitize_options(options)
|
300
|
-
invalid_option_values = [nil,[nil]]
|
304
|
+
invalid_option_values = [nil, [nil]]
|
301
305
|
unless (options.values & invalid_option_values).empty?
|
302
|
-
nil_options = options.select { |_k,v| invalid_option_values.include?(v) }.map(&:first)
|
306
|
+
nil_options = options.select { |_k, v| invalid_option_values.include?(v) }.map(&:first)
|
303
307
|
Kernel.warn "#{caller_locations(2, 1)[0]}: Passing nil, or [nil] to Net::SSH.start is deprecated for keys: #{nil_options.join(', ')}"
|
304
308
|
end
|
305
309
|
end
|
data/net-ssh-public_cert.pem
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
2
|
MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpuZXRz
|
3
|
-
|
4
|
-
|
3
|
+
c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0yMTA4MTAwODMyMzBaFw0yMjA4MTAw
|
4
|
+
ODMyMzBaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB
|
5
5
|
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxieE22fR/qmdPKUHyYTyUx2g
|
6
6
|
wskLwrCkxay+Tvc97ZZUOwf85LDDDPqhQaTWLvRwnIOMgQE2nBPzwalVclK6a+pW
|
7
7
|
x/18KDeZY15vm3Qn5p42b0wi9hUxOqPm3J2hdCLCcgtENgdX21nVzejn39WVqFJO
|
@@ -11,10 +11,10 @@ fBbmDnsMLAtAtauMOxORrbx3EOY7sHku/kSrMg3FXFay7jc6BkbbUij+MjJ/k82l
|
|
11
11
|
AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUBfKiwO2e
|
12
12
|
M4NEiRrVG793qEPLYyMwHwYDVR0RBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20w
|
13
13
|
HwYDVR0SBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20wDQYJKoZIhvcNAQELBQAD
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
ggEBABRChgo0Jo+iXSnTpODNongzZoU0sWqwx3/FQVo8nyAyr1qFuiqpSPb4bDbU
|
15
|
+
DsVnUn3t0X/gGA8qJhutlmfTpEQCjUeyj2x9rWpD3lvttlGWV6btQ0qN4Dfc2gsw
|
16
|
+
rCp9Jpful0HGWhiwfjWfsarqAdtLzIG0UC47IN7LGeCMRJIijOsXQhiZ915eNBEw
|
17
|
+
g9+WSSGHkMFt/7vi2pFkvXSC0+RF8ovvRWf4Zw2aYXtJ1GElgi4ZS/s6ZU0gmv20
|
18
|
+
i4SfC5m5UXIVZvOBYiMuZ/1B2m6R9xU41027zfOVwRFNtlVDiNfQRq6sDmz44At/
|
19
|
+
dv8pkxXDgySe41vzlRXFsgIgz5A=
|
20
20
|
-----END CERTIFICATE-----
|
data/net-ssh.gemspec
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
require_relative 'lib/net/ssh/version'
|
3
2
|
|
4
3
|
Gem::Specification.new do |spec|
|
@@ -16,11 +15,14 @@ Gem::Specification.new do |spec|
|
|
16
15
|
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
16
|
spec.homepage = "https://github.com/net-ssh/net-ssh"
|
18
17
|
spec.license = "MIT"
|
19
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
18
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.6")
|
19
|
+
spec.metadata = {
|
20
|
+
"changelog_uri" => "https://github.com/net-ssh/net-ssh/blob/master/CHANGES.txt"
|
21
|
+
}
|
20
22
|
|
21
23
|
spec.extra_rdoc_files = [
|
22
24
|
"LICENSE.txt",
|
23
|
-
"README.
|
25
|
+
"README.md"
|
24
26
|
]
|
25
27
|
|
26
28
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
@@ -31,12 +33,12 @@ Gem::Specification.new do |spec|
|
|
31
33
|
unless ENV['NET_SSH_NO_ED25519']
|
32
34
|
spec.add_development_dependency("bcrypt_pbkdf", "~> 1.0") unless RUBY_PLATFORM == "java"
|
33
35
|
spec.add_development_dependency("ed25519", "~> 1.2")
|
36
|
+
spec.add_development_dependency('x25519') unless RUBY_PLATFORM == 'java'
|
34
37
|
end
|
35
38
|
|
36
|
-
spec.add_development_dependency "bundler", "
|
37
|
-
|
39
|
+
spec.add_development_dependency "bundler", ">= 1.17"
|
38
40
|
spec.add_development_dependency "minitest", "~> 5.10"
|
39
|
-
spec.add_development_dependency "mocha", "
|
41
|
+
spec.add_development_dependency "mocha", "~> 1.11.2"
|
40
42
|
spec.add_development_dependency "rake", "~> 12.0"
|
41
|
-
spec.add_development_dependency "rubocop", "~>
|
43
|
+
spec.add_development_dependency "rubocop", "~> 1.28.0"
|
42
44
|
end
|
data/support/ssh_tunnel_bug.rb
CHANGED
@@ -15,12 +15,12 @@
|
|
15
15
|
# visible_hostname netsshtest
|
16
16
|
# * Start squid squid -N -d 1 -D
|
17
17
|
# * Run this script
|
18
|
-
# * Configure browser proxy to use localhost with LOCAL_PORT.
|
18
|
+
# * Configure browser proxy to use localhost with LOCAL_PORT.
|
19
19
|
# * Load any page, wait for it to load fully. If the page loads
|
20
20
|
# correctly, move on. If not, something needs to be corrected.
|
21
21
|
# * Refresh the page several times. This should cause this
|
22
22
|
# script to failed with the error: "closed stream". You may
|
23
|
-
# need to try a few times.
|
23
|
+
# need to try a few times.
|
24
24
|
#
|
25
25
|
|
26
26
|
require 'highline/import'
|
@@ -37,7 +37,7 @@ pass = ask("Password: ") { |q| q.echo = "*" }
|
|
37
37
|
puts "Configure your browser proxy to localhost:#{LOCAL_PORT}"
|
38
38
|
|
39
39
|
begin
|
40
|
-
session = Net::SSH.start(host, user, password: pass)
|
40
|
+
session = Net::SSH.start(host, user, password: pass)
|
41
41
|
session.forward.local(LOCAL_PORT, host, PROXY_PORT)
|
42
42
|
session.loop {true}
|
43
43
|
rescue StandardError => e
|
data.tar.gz.sig
CHANGED
Binary file
|