net-ssh 3.2.0.rc2 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +2 -2
  3. data/.dockerignore +6 -0
  4. data/.github/config/rubocop_linter_action.yml +4 -0
  5. data/.github/workflows/ci-with-docker.yml +44 -0
  6. data/.github/workflows/ci.yml +87 -0
  7. data/.github/workflows/rubocop.yml +16 -0
  8. data/.gitignore +13 -0
  9. data/.rubocop.yml +22 -0
  10. data/.rubocop_todo.yml +1081 -0
  11. data/CHANGES.txt +228 -7
  12. data/Dockerfile +27 -0
  13. data/Dockerfile.openssl3 +17 -0
  14. data/Gemfile +13 -0
  15. data/Gemfile.noed25519 +12 -0
  16. data/ISSUE_TEMPLATE.md +30 -0
  17. data/Manifest +4 -5
  18. data/README.md +297 -0
  19. data/Rakefile +125 -74
  20. data/SECURITY.md +4 -0
  21. data/appveyor.yml +58 -0
  22. data/docker-compose.yml +23 -0
  23. data/lib/net/ssh/authentication/agent.rb +279 -18
  24. data/lib/net/ssh/authentication/certificate.rb +183 -0
  25. data/lib/net/ssh/authentication/constants.rb +17 -15
  26. data/lib/net/ssh/authentication/ed25519.rb +186 -0
  27. data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
  28. data/lib/net/ssh/authentication/key_manager.rb +86 -39
  29. data/lib/net/ssh/authentication/methods/abstract.rb +67 -48
  30. data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
  31. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +13 -13
  32. data/lib/net/ssh/authentication/methods/none.rb +16 -19
  33. data/lib/net/ssh/authentication/methods/password.rb +27 -17
  34. data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
  35. data/lib/net/ssh/authentication/pageant.rb +471 -367
  36. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  37. data/lib/net/ssh/authentication/session.rb +131 -121
  38. data/lib/net/ssh/buffer.rb +399 -300
  39. data/lib/net/ssh/buffered_io.rb +154 -150
  40. data/lib/net/ssh/config.rb +308 -185
  41. data/lib/net/ssh/connection/channel.rb +635 -613
  42. data/lib/net/ssh/connection/constants.rb +29 -29
  43. data/lib/net/ssh/connection/event_loop.rb +123 -0
  44. data/lib/net/ssh/connection/keepalive.rb +55 -51
  45. data/lib/net/ssh/connection/session.rb +620 -551
  46. data/lib/net/ssh/connection/term.rb +125 -123
  47. data/lib/net/ssh/errors.rb +101 -99
  48. data/lib/net/ssh/key_factory.rb +197 -105
  49. data/lib/net/ssh/known_hosts.rb +214 -127
  50. data/lib/net/ssh/loggable.rb +50 -49
  51. data/lib/net/ssh/packet.rb +83 -79
  52. data/lib/net/ssh/prompt.rb +50 -81
  53. data/lib/net/ssh/proxy/command.rb +105 -90
  54. data/lib/net/ssh/proxy/errors.rb +12 -10
  55. data/lib/net/ssh/proxy/http.rb +82 -79
  56. data/lib/net/ssh/proxy/https.rb +50 -0
  57. data/lib/net/ssh/proxy/jump.rb +54 -0
  58. data/lib/net/ssh/proxy/socks4.rb +2 -6
  59. data/lib/net/ssh/proxy/socks5.rb +14 -17
  60. data/lib/net/ssh/service/forward.rb +370 -317
  61. data/lib/net/ssh/test/channel.rb +145 -136
  62. data/lib/net/ssh/test/extensions.rb +131 -110
  63. data/lib/net/ssh/test/kex.rb +34 -32
  64. data/lib/net/ssh/test/local_packet.rb +46 -44
  65. data/lib/net/ssh/test/packet.rb +89 -70
  66. data/lib/net/ssh/test/remote_packet.rb +32 -30
  67. data/lib/net/ssh/test/script.rb +156 -142
  68. data/lib/net/ssh/test/socket.rb +49 -48
  69. data/lib/net/ssh/test.rb +82 -77
  70. data/lib/net/ssh/transport/algorithms.rb +441 -360
  71. data/lib/net/ssh/transport/cipher_factory.rb +96 -98
  72. data/lib/net/ssh/transport/constants.rb +32 -24
  73. data/lib/net/ssh/transport/ctr.rb +42 -22
  74. data/lib/net/ssh/transport/hmac/abstract.rb +81 -63
  75. data/lib/net/ssh/transport/hmac/md5.rb +0 -2
  76. data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
  77. data/lib/net/ssh/transport/hmac/none.rb +0 -2
  78. data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
  79. data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
  80. data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
  81. data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
  82. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
  83. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  84. data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
  85. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
  86. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  87. data/lib/net/ssh/transport/hmac.rb +14 -12
  88. data/lib/net/ssh/transport/identity_cipher.rb +54 -52
  89. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  90. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  91. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  92. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  93. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
  94. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  95. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +119 -213
  96. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -61
  97. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
  98. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
  99. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
  100. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
  101. data/lib/net/ssh/transport/kex.rb +15 -12
  102. data/lib/net/ssh/transport/key_expander.rb +24 -20
  103. data/lib/net/ssh/transport/openssl.rb +161 -124
  104. data/lib/net/ssh/transport/packet_stream.rb +225 -185
  105. data/lib/net/ssh/transport/server_version.rb +55 -56
  106. data/lib/net/ssh/transport/session.rb +306 -255
  107. data/lib/net/ssh/transport/state.rb +178 -176
  108. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  109. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  110. data/lib/net/ssh/verifiers/always.rb +58 -0
  111. data/lib/net/ssh/verifiers/never.rb +19 -0
  112. data/lib/net/ssh/version.rb +55 -53
  113. data/lib/net/ssh.rb +110 -47
  114. data/net-ssh-public_cert.pem +18 -18
  115. data/net-ssh.gemspec +36 -205
  116. data/support/ssh_tunnel_bug.rb +5 -5
  117. data.tar.gz.sig +0 -0
  118. metadata +153 -118
  119. metadata.gz.sig +0 -0
  120. data/.travis.yml +0 -18
  121. data/README.rdoc +0 -182
  122. data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
  123. data/lib/net/ssh/authentication/agent/socket.rb +0 -178
  124. data/lib/net/ssh/ruby_compat.rb +0 -46
  125. data/lib/net/ssh/verifiers/lenient.rb +0 -30
  126. data/lib/net/ssh/verifiers/null.rb +0 -12
  127. data/lib/net/ssh/verifiers/secure.rb +0 -52
  128. data/lib/net/ssh/verifiers/strict.rb +0 -24
  129. data/setup.rb +0 -1585
  130. data/support/arcfour_check.rb +0 -20
  131. data/test/README.txt +0 -18
  132. data/test/authentication/methods/common.rb +0 -28
  133. data/test/authentication/methods/test_abstract.rb +0 -51
  134. data/test/authentication/methods/test_hostbased.rb +0 -114
  135. data/test/authentication/methods/test_keyboard_interactive.rb +0 -121
  136. data/test/authentication/methods/test_none.rb +0 -41
  137. data/test/authentication/methods/test_password.rb +0 -95
  138. data/test/authentication/methods/test_publickey.rb +0 -148
  139. data/test/authentication/test_agent.rb +0 -232
  140. data/test/authentication/test_key_manager.rb +0 -240
  141. data/test/authentication/test_session.rb +0 -107
  142. data/test/common.rb +0 -125
  143. data/test/configs/auth_off +0 -5
  144. data/test/configs/auth_on +0 -4
  145. data/test/configs/empty +0 -0
  146. data/test/configs/eqsign +0 -3
  147. data/test/configs/exact_match +0 -8
  148. data/test/configs/host_plus +0 -10
  149. data/test/configs/multihost +0 -4
  150. data/test/configs/negative_match +0 -6
  151. data/test/configs/nohost +0 -19
  152. data/test/configs/numeric_host +0 -4
  153. data/test/configs/proxy_remote_user +0 -2
  154. data/test/configs/send_env +0 -2
  155. data/test/configs/substitutes +0 -8
  156. data/test/configs/wild_cards +0 -14
  157. data/test/connection/test_channel.rb +0 -487
  158. data/test/connection/test_session.rb +0 -564
  159. data/test/integration/README.txt +0 -17
  160. data/test/integration/Vagrantfile +0 -12
  161. data/test/integration/common.rb +0 -63
  162. data/test/integration/playbook.yml +0 -56
  163. data/test/integration/test_forward.rb +0 -637
  164. data/test/integration/test_id_rsa_keys.rb +0 -96
  165. data/test/integration/test_proxy.rb +0 -93
  166. data/test/known_hosts/github +0 -1
  167. data/test/known_hosts/github_hash +0 -1
  168. data/test/manual/test_pageant.rb +0 -37
  169. data/test/start/test_connection.rb +0 -53
  170. data/test/start/test_options.rb +0 -57
  171. data/test/start/test_transport.rb +0 -28
  172. data/test/start/test_user_nil.rb +0 -27
  173. data/test/test_all.rb +0 -12
  174. data/test/test_buffer.rb +0 -433
  175. data/test/test_buffered_io.rb +0 -63
  176. data/test/test_config.rb +0 -268
  177. data/test/test_key_factory.rb +0 -191
  178. data/test/test_known_hosts.rb +0 -66
  179. data/test/transport/hmac/test_md5.rb +0 -41
  180. data/test/transport/hmac/test_md5_96.rb +0 -27
  181. data/test/transport/hmac/test_none.rb +0 -34
  182. data/test/transport/hmac/test_ripemd160.rb +0 -36
  183. data/test/transport/hmac/test_sha1.rb +0 -36
  184. data/test/transport/hmac/test_sha1_96.rb +0 -27
  185. data/test/transport/hmac/test_sha2_256.rb +0 -37
  186. data/test/transport/hmac/test_sha2_256_96.rb +0 -27
  187. data/test/transport/hmac/test_sha2_512.rb +0 -37
  188. data/test/transport/hmac/test_sha2_512_96.rb +0 -27
  189. data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
  190. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -150
  191. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -96
  192. data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -19
  193. data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
  194. data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
  195. data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
  196. data/test/transport/test_algorithms.rb +0 -328
  197. data/test/transport/test_cipher_factory.rb +0 -443
  198. data/test/transport/test_hmac.rb +0 -34
  199. data/test/transport/test_identity_cipher.rb +0 -40
  200. data/test/transport/test_packet_stream.rb +0 -1762
  201. data/test/transport/test_server_version.rb +0 -74
  202. data/test/transport/test_session.rb +0 -331
  203. data/test/transport/test_state.rb +0 -181
  204. data/test/verifiers/test_secure.rb +0 -40
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'
@@ -11,9 +12,9 @@ require 'net/ssh/loggable'
11
12
  require 'net/ssh/transport/session'
12
13
  require 'net/ssh/authentication/session'
13
14
  require 'net/ssh/connection/session'
15
+ require 'net/ssh/prompt'
14
16
 
15
17
  module Net
16
-
17
18
  # Net::SSH is a library for interacting, programmatically, with remote
18
19
  # processes via the SSH2 protocol. Sessions are always initiated via
19
20
  # Net::SSH.start. From there, a program interacts with the new SSH session
@@ -40,37 +41,39 @@ module Net
40
41
  #
41
42
  # == X == "execute a command and capture the output"
42
43
  #
43
- # Net::SSH.start("host", "user", :password => "password") do |ssh|
44
+ # Net::SSH.start("host", "user", password: "password") do |ssh|
44
45
  # result = ssh.exec!("ls -l")
45
46
  # puts result
46
47
  # end
47
48
  #
48
49
  # == X == "forward connections on a local port to a remote host"
49
50
  #
50
- # Net::SSH.start("host", "user", :password => "password") do |ssh|
51
+ # Net::SSH.start("host", "user", password: "password") do |ssh|
51
52
  # ssh.forward.local(1234, "www.google.com", 80)
52
53
  # ssh.loop { true }
53
54
  # end
54
55
  #
55
56
  # == X == "forward connections on a remote port to the local host"
56
57
  #
57
- # Net::SSH.start("host", "user", :password => "password") do |ssh|
58
+ # Net::SSH.start("host", "user", password: "password") do |ssh|
58
59
  # ssh.forward.remote(80, "www.google.com", 1234)
59
60
  # ssh.loop { true }
60
61
  # end
61
62
  module SSH
62
63
  # This is the set of options that Net::SSH.start recognizes. See
63
64
  # Net::SSH.start for a description of each option.
64
- VALID_OPTIONS = [
65
- :auth_methods, :bind_address, :compression, :compression_level, :config,
66
- :encryption, :forward_agent, :hmac, :host_key, :remote_user,
67
- :keepalive, :keepalive_interval, :keepalive_maxcount, :kex, :keys, :key_data,
68
- :languages, :logger, :paranoid, :password, :port, :proxy,
69
- :rekey_blocks_limit,:rekey_limit, :rekey_packet_limit, :timeout, :verbose,
70
- :known_hosts, :global_known_hosts_file, :user_known_hosts_file, :host_key_alias,
71
- :host_name, :user, :properties, :passphrase, :keys_only, :max_pkt_size,
72
- :max_win_size, :send_env, :use_agent, :number_of_password_prompts,
73
- :append_supported_algorithms, :non_interactive, :agent_socket_factory
65
+ VALID_OPTIONS = %i[
66
+ auth_methods bind_address compression compression_level config
67
+ encryption forward_agent hmac host_key remote_user
68
+ keepalive keepalive_interval keepalive_maxcount kex keys key_data
69
+ keycerts languages logger paranoid password port proxy
70
+ rekey_blocks_limit rekey_limit rekey_packet_limit timeout verbose
71
+ known_hosts global_known_hosts_file user_known_hosts_file host_key_alias
72
+ host_name user properties passphrase keys_only max_pkt_size
73
+ max_win_size send_env set_env use_agent number_of_password_prompts
74
+ append_all_supported_algorithms non_interactive password_prompt
75
+ agent_socket_factory minimum_dh_bits verify_host_key
76
+ fingerprint_hash check_host_ip pubkey_algorithms
74
77
  ]
75
78
 
76
79
  # The standard means of starting a new SSH connection. When used with a
@@ -105,6 +108,8 @@ module Net
105
108
  # * :bind_address => the IP address on the connecting machine to use in
106
109
  # establishing connection. (:bind_address is discarded if :proxy
107
110
  # is set.)
111
+ # * :check_host_ip => Also ckeck IP address when connecting to remote host.
112
+ # Defaults to +true+.
108
113
  # * :compression => the compression algorithm to use, or +true+ to use
109
114
  # whatever is supported.
110
115
  # * :compression_level => the compression level to use when sending data
@@ -116,7 +121,7 @@ module Net
116
121
  # * :forward_agent => set to true if you want the SSH agent connection to
117
122
  # be forwarded
118
123
  # * :known_hosts => a custom object holding known hosts records.
119
- # 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.
120
125
  # * :global_known_hosts_file => the location of the global known hosts
121
126
  # file. Set to an array if you want to specify multiple global known
122
127
  # hosts files. Defaults to %w(/etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2).
@@ -139,6 +144,8 @@ module Net
139
144
  # * :kex => the key exchange algorithm (or algorithms) to use
140
145
  # * :keys => an array of file names of private keys to use for publickey
141
146
  # and hostbased authentication
147
+ # * :keycerts => an array of file names of key certificates to use
148
+ # with publickey authentication
142
149
  # * :key_data => an array of strings, with each element of the array being
143
150
  # a raw private key in PEM format.
144
151
  # * :keys_only => set to +true+ to use only private keys from +keys+ and
@@ -151,12 +158,11 @@ module Net
151
158
  # for better performance if your SSH server supports it (most do).
152
159
  # * :max_win_size => maximum size we tell the other side that is supported for
153
160
  # the window.
154
- # * :paranoid => either false, true, :very, or :secure specifying how
155
- # strict host-key verification should be (in increasing order here).
156
- # You can also provide an own Object which responds to +verify+. The argument
157
- # given to +verify+ is a hash consisting of the +:key+, the +:key_blob+,
158
- # the +:fingerprint+ and the +:session+. Returning true accepts the host key,
159
- # returning false declines it and closes the connection.
161
+ # * :non_interactive => set to true if your app is non interactive and prefers
162
+ # authentication failure vs password prompt. Non-interactive applications
163
+ # should set it to true to prefer failing a password/etc auth methods vs.
164
+ # asking for password.
165
+ # * :paranoid => deprecated alias for :verify_host_key
160
166
  # * :passphrase => the passphrase to use when loading a private key (default
161
167
  # is +nil+, for no passphrase)
162
168
  # * :password => the password to use to login
@@ -164,11 +170,18 @@ module Net
164
170
  # * :properties => a hash of key/value pairs to add to the new connection's
165
171
  # properties (see Net::SSH::Connection::Session#properties)
166
172
  # * :proxy => a proxy instance (see Proxy) to use when connecting
173
+ # * :pubkey_algorithms => the public key authentication algorithms to use for
174
+ # this connection. Valid values are 'rsa-sha2-256-cert-v01@openssh.com',
175
+ # 'ssh-rsa-cert-v01@openssh.com', 'rsa-sha2-256', 'ssh-rsa'. Currently, this
176
+ # option is only used for RSA public key authentication and ignored for other
177
+ # types.
167
178
  # * :rekey_blocks_limit => the max number of blocks to process before rekeying
168
179
  # * :rekey_limit => the max number of bytes to process before rekeying
169
180
  # * :rekey_packet_limit => the max number of packets to process before rekeying
170
181
  # * :send_env => an array of local environment variable names to export to the
171
182
  # remote environment. Names may be given as String or Regexp.
183
+ # * :set_env => a hash of environment variable names and values to set to the
184
+ # remote environment. Override the ones if specified in +send_env+.
172
185
  # * :timeout => how long to wait for the initial connection to be made
173
186
  # * :user => the user name to log in as; this overrides the +user+
174
187
  # parameter, and is primarily only useful when provided via an SSH
@@ -177,10 +190,8 @@ module Net
177
190
  # * :user_known_hosts_file => the location of the user known hosts file.
178
191
  # Set to an array to specify multiple user known hosts files.
179
192
  # Defaults to %w(~/.ssh/known_hosts ~/.ssh/known_hosts2).
180
- # * :use_agent => Set false to disable the use of ssh-agent. Defaults to
193
+ # * :use_agent => Set false to disable the use of ssh-agent. Defaults to
181
194
  # true
182
- # * :non_interactive => set to true if your app is non interactive and prefers
183
- # authentication failure vs password prompt
184
195
  # * :verbose => how verbose to be (Logger verbosity constants, Logger::DEBUG
185
196
  # is very verbose, Logger::FATAL is all but silent). Logger::FATAL is the
186
197
  # default. The symbols :debug, :info, :warn, :error, and :fatal are also
@@ -190,49 +201,61 @@ module Net
190
201
  # * :number_of_password_prompts => Number of prompts for the password
191
202
  # authentication method defaults to 3 set to 0 to disable prompt for
192
203
  # password auth method
193
- # * :non_interactive => non interactive applications should set it to true
194
- # to prefer failing a password/etc auth methods vs asking for password
204
+ # * :password_prompt => a custom prompt object with ask method. See Net::SSH::Prompt
205
+ #
195
206
  # * :agent_socket_factory => enables the user to pass a lambda/block that will serve as the socket factory
196
- # Net::SSH::start(user,host,agent_socket_factory: ->{ UNIXSocket.open('/foo/bar') })
207
+ # Net::SSH.start(host,user,agent_socket_factory: ->{ UNIXSocket.open('/foo/bar') })
197
208
  # example: ->{ UNIXSocket.open('/foo/bar')}
198
- #
209
+ # * :verify_host_key => specify how strict host-key verification should be.
210
+ # In order of increasing strictness:
211
+ # * :never (very insecure) ::Net::SSH::Verifiers::Never
212
+ # * :accept_new_or_local_tunnel (insecure) ::Net::SSH::Verifiers::AcceptNewOrLocalTunnel
213
+ # * :accept_new (insecure) ::Net::SSH::Verifiers::AcceptNew
214
+ # * :always (secure) ::Net::SSH::Verifiers::Always
215
+ # You can also provide an own Object which responds to +verify+. The argument
216
+ # given to +verify+ is a hash consisting of the +:key+, the +:key_blob+,
217
+ # the +:fingerprint+ and the +:session+. Returning true accepts the host key,
218
+ # returning false declines it and closes the connection.
219
+ # * :fingerprint_hash => 'MD5' or 'SHA256', defaults to 'SHA256'
199
220
  # If +user+ parameter is nil it defaults to USER from ssh_config, or
200
221
  # local username
201
- def self.start(host, user=nil, options={}, &block)
222
+ def self.start(host, user = nil, options = {}, &block)
202
223
  invalid_options = options.keys - VALID_OPTIONS
203
224
  if invalid_options.any?
204
225
  raise ArgumentError, "invalid option(s): #{invalid_options.join(', ')}"
205
226
  end
206
227
 
228
+ assign_defaults(options)
229
+ _sanitize_options(options)
230
+
207
231
  options[:user] = user if user
208
232
  options = configuration_for(host, options.fetch(:config, true)).merge(options)
209
233
  host = options.fetch(:host_name, host)
210
234
 
211
- if !options.key?(:logger)
212
- options[:logger] = Logger.new(STDERR)
213
- options[:logger].level = Logger::FATAL
214
- end
235
+ options[:check_host_ip] = true unless options.key?(:check_host_ip)
215
236
 
216
237
  if options[:non_interactive]
217
238
  options[:number_of_password_prompts] = 0
218
239
  end
219
240
 
241
+ _support_deprecated_option_paranoid(options)
242
+
220
243
  if options[:verbose]
221
244
  options[:logger].level = case options[:verbose]
222
- when Fixnum then options[:verbose]
223
- when :debug then Logger::DEBUG
224
- when :info then Logger::INFO
225
- when :warn then Logger::WARN
226
- when :error then Logger::ERROR
227
- when :fatal then Logger::FATAL
228
- else raise ArgumentError, "can't convert #{options[:verbose].inspect} to any of the Logger level constants"
229
- end
245
+ when Integer then options[:verbose]
246
+ when :debug then Logger::DEBUG
247
+ when :info then Logger::INFO
248
+ when :warn then Logger::WARN
249
+ when :error then Logger::ERROR
250
+ when :fatal then Logger::FATAL
251
+ else raise ArgumentError, "can't convert #{options[:verbose].inspect} to any of the Logger level constants"
252
+ end
230
253
  end
231
254
 
232
255
  transport = Transport::Session.new(host, options)
233
256
  auth = Authentication::Session.new(transport, options)
234
257
 
235
- user = options.fetch(:user, user) || Etc.getlogin
258
+ user = options.fetch(:user, user) || Etc.getpwuid.name
236
259
  if auth.authenticate("ssh-connection", user, options[:password])
237
260
  connection = Connection::Session.new(transport, options)
238
261
  if block_given?
@@ -259,14 +282,54 @@ module Net
259
282
  # to read.
260
283
  #
261
284
  # See Net::SSH::Config for the full description of all supported options.
262
- def self.configuration_for(host, use_ssh_config=true)
285
+ def self.configuration_for(host, use_ssh_config)
263
286
  files = case use_ssh_config
264
- when true then Net::SSH::Config.default_files
265
- when false, nil then return {}
266
- else Array(use_ssh_config)
267
- end
287
+ when true then Net::SSH::Config.expandable_default_files
288
+ when false, nil then return {}
289
+ else Array(use_ssh_config)
290
+ end
268
291
 
269
292
  Net::SSH::Config.for(host, files)
270
293
  end
294
+
295
+ def self.assign_defaults(options)
296
+ if !options[:logger]
297
+ options[:logger] = Logger.new(STDERR)
298
+ options[:logger].level = Logger::FATAL
299
+ end
300
+
301
+ options[:password_prompt] ||= Prompt.default(options)
302
+
303
+ %i[password passphrase].each do |key|
304
+ options.delete(key) if options.key?(key) && options[key].nil?
305
+ end
306
+ end
307
+
308
+ def self._sanitize_options(options)
309
+ invalid_option_values = [nil, [nil]]
310
+ unless (options.values & invalid_option_values).empty?
311
+ nil_options = options.select { |_k, v| invalid_option_values.include?(v) }.map(&:first)
312
+ Kernel.warn "#{caller_locations(2, 1)[0]}: Passing nil, or [nil] to Net::SSH.start is deprecated for keys: #{nil_options.join(', ')}"
313
+ end
314
+ end
315
+ private_class_method :_sanitize_options
316
+
317
+ def self._support_deprecated_option_paranoid(options)
318
+ if options.key?(:paranoid)
319
+ Kernel.warn(
320
+ ":paranoid is deprecated, please use :verify_host_key. Supported " \
321
+ "values are exactly the same, only the name of the option has changed."
322
+ )
323
+ if options.key?(:verify_host_key)
324
+ Kernel.warn(
325
+ "Both :paranoid and :verify_host_key were specified. " \
326
+ ":verify_host_key takes precedence, :paranoid will be ignored."
327
+ )
328
+ else
329
+ options[:verify_host_key] = options.delete(:paranoid)
330
+ end
331
+ end
332
+ end
333
+ private_class_method :_support_deprecated_option_paranoid
271
334
  end
272
335
  end
@@ -1,20 +1,20 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIDODCCAiCgAwIBAgIBADANBgkqhkiG9w0BAQUFADBCMRAwDgYDVQQDDAduZXQt
3
- c3NoMRkwFwYKCZImiZPyLGQBGRYJc29sdXRpb3VzMRMwEQYKCZImiZPyLGQBGRYD
4
- Y29tMB4XDTE1MTIwNjIxMDYyNFoXDTE2MTIwNTIxMDYyNFowQjEQMA4GA1UEAwwH
5
- bmV0LXNzaDEZMBcGCgmSJomT8ixkARkWCXNvbHV0aW91czETMBEGCgmSJomT8ixk
6
- ARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYnhNtn0f6p
7
- nTylB8mE8lMdoMLJC8KwpMWsvk73Pe2WVDsH/OSwwwz6oUGk1i70cJyDjIEBNpwT
8
- 88GpVXJSumvqVsf9fCg3mWNeb5t0J+aeNm9MIvYVMTqj5tydoXQiwnILRDYHV9tZ
9
- 1c3o59/VlahSTpZ7YEgzVufpAkvEGkbJiG849exiipK7MN/ZIkMOxYVnyRXk43Xc
10
- 6GYlsHOfSgPwcXwW5g57DCwLQLWrjDsTka28dxDmO7B5Lv5EqzINxVxWsu43OgZG
11
- 21Io/jIyf5PNpeKPKNGDuAQJ8mvdMYBJoDhtCwgsUYbl0BZzA7g4ytl51HtIeP+j
12
- Qp/eAvs/RrECAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUBfKiwO2eM4NE
13
- iRrVG793qEPLYyMwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQCfZFdb
14
- p4jzkfIzGDbiOxd0R8sdqJoC4nMLEgnQ7dLulawwA3IXe3sHAKgA5kmH3prsKc5H
15
- zVmM5NlH2P1nRbegIkQTYiIod1hZQCNxdmVG/fprMqPq0ybpUOjjrP5pj0OtszE1
16
- F2dQia1hOEstMR+n0nAtWII9HJAEyeZjVV0s2Cl7Pt85XJ3hxFcCKwzqsK5xRI7a
17
- B3vwh3/JJYrFonIohQ//Lg9qTZASEkoKLlq1/hFeICoCGGIGLq45ZB7CzXLooCKi
18
- s/ZUKye79ELwFYKJOhjW5g725OL3hy+llhEleytwKRwgXFQBPTC4f5UkdxZVVWGH
19
- e2C9M1m/2odPZo8h
2
+ MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpuZXRz
3
+ c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0yMzAxMjQwMzE3NTVaFw0yNDAxMjQw
4
+ MzE3NTVaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB
5
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxieE22fR/qmdPKUHyYTyUx2g
6
+ wskLwrCkxay+Tvc97ZZUOwf85LDDDPqhQaTWLvRwnIOMgQE2nBPzwalVclK6a+pW
7
+ x/18KDeZY15vm3Qn5p42b0wi9hUxOqPm3J2hdCLCcgtENgdX21nVzejn39WVqFJO
8
+ lntgSDNW5+kCS8QaRsmIbzj17GKKkrsw39kiQw7FhWfJFeTjddzoZiWwc59KA/Bx
9
+ fBbmDnsMLAtAtauMOxORrbx3EOY7sHku/kSrMg3FXFay7jc6BkbbUij+MjJ/k82l
10
+ 4o8o0YO4BAnya90xgEmgOG0LCCxRhuXQFnMDuDjK2XnUe0h4/6NCn94C+z9GsQID
11
+ AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUBfKiwO2e
12
+ M4NEiRrVG793qEPLYyMwHwYDVR0RBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20w
13
+ HwYDVR0SBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20wDQYJKoZIhvcNAQELBQAD
14
+ ggEBAHyOSaOUji+EJFWZ46g+2EZ/kG7EFloFtIQUz8jDJIWGE+3NV5po1M0Z6EqH
15
+ XmG3BtMLfgOV9NwMQRqIdKnZDfKsqM/FOu+9IqrP+OieAde5OrXR2pzQls60Xft7
16
+ 3qNVaQS99woQRqiUiDQQ7WagOYrZjuVANqTDNt4myzGSjS5sHcKlz3PRn0LJRMe5
17
+ ouuLwQ7BCXityv5RRXex2ibCOyY7pB5ris6xDnPe1WdlyCfUf1Fb+Yqxpy6a8QmH
18
+ v84waVXQ2i5M7pJaHVBF7DxxeW/q8W3VCnsq8vmmvULSThD18QqYGaFDJeN8sTR4
19
+ 6tfjgZ6OvGSScvbCMHkCE9XjonE=
20
20
  -----END CERTIFICATE-----
data/net-ssh.gemspec CHANGED
@@ -1,213 +1,44 @@
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 3.2.0.rc2 ruby lib
1
+ require_relative 'lib/net/ssh/version'
6
2
 
7
- Gem::Specification.new do |s|
8
- s.name = "net-ssh"
9
- s.version = "3.2.0.rc2"
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "net-ssh"
5
+ spec.version = Net::SSH::Version::STRING
6
+ spec.authors = ["Jamis Buck", "Delano Mandelbaum", "Mikl\u{f3}s Fazekas"]
7
+ spec.email = ["net-ssh@solutious.com"]
10
8
 
11
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") 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 = "2016-05-29"
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 = [
19
- "LICENSE.txt",
20
- "README.rdoc"
21
- ]
22
- s.files = [
23
- ".travis.yml",
24
- "CHANGES.txt",
9
+ if ENV['NET_SSH_BUILDGEM_SIGNED']
10
+ spec.cert_chain = ["net-ssh-public_cert.pem"]
11
+ spec.signing_key = "/mnt/gem/net-ssh-private_key.pem"
12
+ end
13
+
14
+ spec.summary = %q{Net::SSH: a pure-Ruby implementation of the SSH2 client protocol.}
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.}
16
+ spec.homepage = "https://github.com/net-ssh/net-ssh"
17
+ spec.license = "MIT"
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
+ }
22
+
23
+ spec.extra_rdoc_files = [
25
24
  "LICENSE.txt",
26
- "Manifest",
27
- "README.rdoc",
28
- "Rakefile",
29
- "THANKS.txt",
30
- "lib/net/ssh.rb",
31
- "lib/net/ssh/authentication/agent.rb",
32
- "lib/net/ssh/authentication/agent/java_pageant.rb",
33
- "lib/net/ssh/authentication/agent/socket.rb",
34
- "lib/net/ssh/authentication/constants.rb",
35
- "lib/net/ssh/authentication/key_manager.rb",
36
- "lib/net/ssh/authentication/methods/abstract.rb",
37
- "lib/net/ssh/authentication/methods/hostbased.rb",
38
- "lib/net/ssh/authentication/methods/keyboard_interactive.rb",
39
- "lib/net/ssh/authentication/methods/none.rb",
40
- "lib/net/ssh/authentication/methods/password.rb",
41
- "lib/net/ssh/authentication/methods/publickey.rb",
42
- "lib/net/ssh/authentication/pageant.rb",
43
- "lib/net/ssh/authentication/session.rb",
44
- "lib/net/ssh/buffer.rb",
45
- "lib/net/ssh/buffered_io.rb",
46
- "lib/net/ssh/config.rb",
47
- "lib/net/ssh/connection/channel.rb",
48
- "lib/net/ssh/connection/constants.rb",
49
- "lib/net/ssh/connection/keepalive.rb",
50
- "lib/net/ssh/connection/session.rb",
51
- "lib/net/ssh/connection/term.rb",
52
- "lib/net/ssh/errors.rb",
53
- "lib/net/ssh/key_factory.rb",
54
- "lib/net/ssh/known_hosts.rb",
55
- "lib/net/ssh/loggable.rb",
56
- "lib/net/ssh/packet.rb",
57
- "lib/net/ssh/prompt.rb",
58
- "lib/net/ssh/proxy/command.rb",
59
- "lib/net/ssh/proxy/errors.rb",
60
- "lib/net/ssh/proxy/http.rb",
61
- "lib/net/ssh/proxy/socks4.rb",
62
- "lib/net/ssh/proxy/socks5.rb",
63
- "lib/net/ssh/ruby_compat.rb",
64
- "lib/net/ssh/service/forward.rb",
65
- "lib/net/ssh/test.rb",
66
- "lib/net/ssh/test/channel.rb",
67
- "lib/net/ssh/test/extensions.rb",
68
- "lib/net/ssh/test/kex.rb",
69
- "lib/net/ssh/test/local_packet.rb",
70
- "lib/net/ssh/test/packet.rb",
71
- "lib/net/ssh/test/remote_packet.rb",
72
- "lib/net/ssh/test/script.rb",
73
- "lib/net/ssh/test/socket.rb",
74
- "lib/net/ssh/transport/algorithms.rb",
75
- "lib/net/ssh/transport/cipher_factory.rb",
76
- "lib/net/ssh/transport/constants.rb",
77
- "lib/net/ssh/transport/ctr.rb",
78
- "lib/net/ssh/transport/hmac.rb",
79
- "lib/net/ssh/transport/hmac/abstract.rb",
80
- "lib/net/ssh/transport/hmac/md5.rb",
81
- "lib/net/ssh/transport/hmac/md5_96.rb",
82
- "lib/net/ssh/transport/hmac/none.rb",
83
- "lib/net/ssh/transport/hmac/ripemd160.rb",
84
- "lib/net/ssh/transport/hmac/sha1.rb",
85
- "lib/net/ssh/transport/hmac/sha1_96.rb",
86
- "lib/net/ssh/transport/hmac/sha2_256.rb",
87
- "lib/net/ssh/transport/hmac/sha2_256_96.rb",
88
- "lib/net/ssh/transport/hmac/sha2_512.rb",
89
- "lib/net/ssh/transport/hmac/sha2_512_96.rb",
90
- "lib/net/ssh/transport/identity_cipher.rb",
91
- "lib/net/ssh/transport/kex.rb",
92
- "lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb",
93
- "lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb",
94
- "lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb",
95
- "lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb",
96
- "lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb",
97
- "lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb",
98
- "lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb",
99
- "lib/net/ssh/transport/key_expander.rb",
100
- "lib/net/ssh/transport/openssl.rb",
101
- "lib/net/ssh/transport/packet_stream.rb",
102
- "lib/net/ssh/transport/server_version.rb",
103
- "lib/net/ssh/transport/session.rb",
104
- "lib/net/ssh/transport/state.rb",
105
- "lib/net/ssh/verifiers/lenient.rb",
106
- "lib/net/ssh/verifiers/null.rb",
107
- "lib/net/ssh/verifiers/secure.rb",
108
- "lib/net/ssh/verifiers/strict.rb",
109
- "lib/net/ssh/version.rb",
110
- "net-ssh-public_cert.pem",
111
- "net-ssh.gemspec",
112
- "setup.rb",
113
- "support/arcfour_check.rb",
114
- "support/ssh_tunnel_bug.rb",
115
- "test/README.txt",
116
- "test/authentication/methods/common.rb",
117
- "test/authentication/methods/test_abstract.rb",
118
- "test/authentication/methods/test_hostbased.rb",
119
- "test/authentication/methods/test_keyboard_interactive.rb",
120
- "test/authentication/methods/test_none.rb",
121
- "test/authentication/methods/test_password.rb",
122
- "test/authentication/methods/test_publickey.rb",
123
- "test/authentication/test_agent.rb",
124
- "test/authentication/test_key_manager.rb",
125
- "test/authentication/test_session.rb",
126
- "test/common.rb",
127
- "test/configs/auth_off",
128
- "test/configs/auth_on",
129
- "test/configs/empty",
130
- "test/configs/eqsign",
131
- "test/configs/exact_match",
132
- "test/configs/host_plus",
133
- "test/configs/multihost",
134
- "test/configs/negative_match",
135
- "test/configs/nohost",
136
- "test/configs/numeric_host",
137
- "test/configs/proxy_remote_user",
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/integration/README.txt",
144
- "test/integration/Vagrantfile",
145
- "test/integration/common.rb",
146
- "test/integration/playbook.yml",
147
- "test/integration/test_forward.rb",
148
- "test/integration/test_id_rsa_keys.rb",
149
- "test/integration/test_proxy.rb",
150
- "test/known_hosts/github",
151
- "test/known_hosts/github_hash",
152
- "test/manual/test_pageant.rb",
153
- "test/start/test_connection.rb",
154
- "test/start/test_options.rb",
155
- "test/start/test_transport.rb",
156
- "test/start/test_user_nil.rb",
157
- "test/test_all.rb",
158
- "test/test_buffer.rb",
159
- "test/test_buffered_io.rb",
160
- "test/test_config.rb",
161
- "test/test_key_factory.rb",
162
- "test/test_known_hosts.rb",
163
- "test/transport/hmac/test_md5.rb",
164
- "test/transport/hmac/test_md5_96.rb",
165
- "test/transport/hmac/test_none.rb",
166
- "test/transport/hmac/test_ripemd160.rb",
167
- "test/transport/hmac/test_sha1.rb",
168
- "test/transport/hmac/test_sha1_96.rb",
169
- "test/transport/hmac/test_sha2_256.rb",
170
- "test/transport/hmac/test_sha2_256_96.rb",
171
- "test/transport/hmac/test_sha2_512.rb",
172
- "test/transport/hmac/test_sha2_512_96.rb",
173
- "test/transport/kex/test_diffie_hellman_group14_sha1.rb",
174
- "test/transport/kex/test_diffie_hellman_group1_sha1.rb",
175
- "test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb",
176
- "test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb",
177
- "test/transport/kex/test_ecdh_sha2_nistp256.rb",
178
- "test/transport/kex/test_ecdh_sha2_nistp384.rb",
179
- "test/transport/kex/test_ecdh_sha2_nistp521.rb",
180
- "test/transport/test_algorithms.rb",
181
- "test/transport/test_cipher_factory.rb",
182
- "test/transport/test_hmac.rb",
183
- "test/transport/test_identity_cipher.rb",
184
- "test/transport/test_packet_stream.rb",
185
- "test/transport/test_server_version.rb",
186
- "test/transport/test_session.rb",
187
- "test/transport/test_state.rb",
188
- "test/verifiers/test_secure.rb"
25
+ "README.md"
189
26
  ]
190
- s.homepage = "https://github.com/net-ssh/net-ssh"
191
- s.licenses = ["MIT"]
192
- s.required_ruby_version = Gem::Requirement.new(">= 2.0")
193
- s.rubyforge_project = "net-ssh"
194
- s.rubygems_version = "2.4.3"
195
- s.signing_key = "/mnt/gem/net-ssh-private_key.pem"
196
- s.summary = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
197
27
 
198
- if s.respond_to? :specification_version then
199
- s.specification_version = 4
28
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
29
+ spec.bindir = "exe"
30
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
200
32
 
201
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
202
- s.add_development_dependency(%q<test-unit>, [">= 0"])
203
- s.add_development_dependency(%q<mocha>, [">= 0"])
204
- else
205
- s.add_dependency(%q<test-unit>, [">= 0"])
206
- s.add_dependency(%q<mocha>, [">= 0"])
207
- end
208
- else
209
- s.add_dependency(%q<test-unit>, [">= 0"])
210
- s.add_dependency(%q<mocha>, [">= 0"])
33
+ unless ENV['NET_SSH_NO_ED25519']
34
+ spec.add_development_dependency("bcrypt_pbkdf", "~> 1.0") unless RUBY_PLATFORM == "java"
35
+ spec.add_development_dependency("ed25519", "~> 1.2")
36
+ spec.add_development_dependency('x25519') unless RUBY_PLATFORM == 'java'
211
37
  end
212
- end
213
38
 
39
+ spec.add_development_dependency "bundler", ">= 1.17"
40
+ spec.add_development_dependency "minitest", "~> 5.10"
41
+ spec.add_development_dependency "mocha", "~> 1.11.2"
42
+ spec.add_development_dependency "rake", "~> 12.0"
43
+ spec.add_development_dependency "rubocop", "~> 1.28.0"
44
+ end
@@ -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,10 +37,10 @@ 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
- session.loop{true}
43
- rescue => e
42
+ session.loop {true}
43
+ rescue StandardError => e
44
44
  puts e.message
45
45
  puts e.backtrace
46
46
  end
data.tar.gz.sig CHANGED
Binary file