net-ssh 3.2.0 → 7.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (210) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.dockerignore +6 -0
  4. data/.github/FUNDING.yml +1 -0
  5. data/.github/config/rubocop_linter_action.yml +4 -0
  6. data/.github/workflows/ci-with-docker.yml +44 -0
  7. data/.github/workflows/ci.yml +93 -0
  8. data/.github/workflows/rubocop.yml +16 -0
  9. data/.gitignore +13 -0
  10. data/.rubocop.yml +22 -0
  11. data/.rubocop_todo.yml +1081 -0
  12. data/CHANGES.txt +237 -7
  13. data/DEVELOPMENT.md +23 -0
  14. data/Dockerfile +27 -0
  15. data/Dockerfile.openssl3 +17 -0
  16. data/Gemfile +13 -0
  17. data/Gemfile.noed25519 +12 -0
  18. data/Gemfile.norbnacl +12 -0
  19. data/ISSUE_TEMPLATE.md +30 -0
  20. data/Manifest +4 -5
  21. data/README.md +298 -0
  22. data/Rakefile +125 -74
  23. data/SECURITY.md +4 -0
  24. data/appveyor.yml +58 -0
  25. data/docker-compose.yml +23 -0
  26. data/lib/net/ssh/authentication/agent.rb +279 -18
  27. data/lib/net/ssh/authentication/certificate.rb +183 -0
  28. data/lib/net/ssh/authentication/constants.rb +17 -15
  29. data/lib/net/ssh/authentication/ed25519.rb +186 -0
  30. data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
  31. data/lib/net/ssh/authentication/key_manager.rb +86 -39
  32. data/lib/net/ssh/authentication/methods/abstract.rb +67 -48
  33. data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
  34. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +13 -13
  35. data/lib/net/ssh/authentication/methods/none.rb +16 -19
  36. data/lib/net/ssh/authentication/methods/password.rb +27 -17
  37. data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
  38. data/lib/net/ssh/authentication/pageant.rb +471 -367
  39. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  40. data/lib/net/ssh/authentication/session.rb +131 -121
  41. data/lib/net/ssh/buffer.rb +399 -300
  42. data/lib/net/ssh/buffered_io.rb +154 -150
  43. data/lib/net/ssh/config.rb +308 -185
  44. data/lib/net/ssh/connection/channel.rb +635 -613
  45. data/lib/net/ssh/connection/constants.rb +29 -29
  46. data/lib/net/ssh/connection/event_loop.rb +123 -0
  47. data/lib/net/ssh/connection/keepalive.rb +55 -51
  48. data/lib/net/ssh/connection/session.rb +620 -551
  49. data/lib/net/ssh/connection/term.rb +125 -123
  50. data/lib/net/ssh/errors.rb +101 -99
  51. data/lib/net/ssh/key_factory.rb +197 -105
  52. data/lib/net/ssh/known_hosts.rb +214 -127
  53. data/lib/net/ssh/loggable.rb +50 -49
  54. data/lib/net/ssh/packet.rb +83 -79
  55. data/lib/net/ssh/prompt.rb +50 -81
  56. data/lib/net/ssh/proxy/command.rb +105 -90
  57. data/lib/net/ssh/proxy/errors.rb +12 -10
  58. data/lib/net/ssh/proxy/http.rb +82 -79
  59. data/lib/net/ssh/proxy/https.rb +50 -0
  60. data/lib/net/ssh/proxy/jump.rb +54 -0
  61. data/lib/net/ssh/proxy/socks4.rb +2 -6
  62. data/lib/net/ssh/proxy/socks5.rb +14 -17
  63. data/lib/net/ssh/service/forward.rb +370 -317
  64. data/lib/net/ssh/test/channel.rb +145 -136
  65. data/lib/net/ssh/test/extensions.rb +131 -110
  66. data/lib/net/ssh/test/kex.rb +34 -32
  67. data/lib/net/ssh/test/local_packet.rb +46 -44
  68. data/lib/net/ssh/test/packet.rb +89 -70
  69. data/lib/net/ssh/test/remote_packet.rb +32 -30
  70. data/lib/net/ssh/test/script.rb +156 -142
  71. data/lib/net/ssh/test/socket.rb +49 -48
  72. data/lib/net/ssh/test.rb +82 -77
  73. data/lib/net/ssh/transport/algorithms.rb +462 -359
  74. data/lib/net/ssh/transport/chacha20_poly1305_cipher.rb +117 -0
  75. data/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb +17 -0
  76. data/lib/net/ssh/transport/cipher_factory.rb +122 -99
  77. data/lib/net/ssh/transport/constants.rb +32 -24
  78. data/lib/net/ssh/transport/ctr.rb +42 -22
  79. data/lib/net/ssh/transport/hmac/abstract.rb +81 -63
  80. data/lib/net/ssh/transport/hmac/md5.rb +0 -2
  81. data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
  82. data/lib/net/ssh/transport/hmac/none.rb +0 -2
  83. data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
  84. data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
  85. data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
  86. data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
  87. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
  88. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  89. data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
  90. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
  91. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  92. data/lib/net/ssh/transport/hmac.rb +14 -12
  93. data/lib/net/ssh/transport/identity_cipher.rb +54 -44
  94. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  95. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  96. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  97. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  98. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
  99. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  100. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +119 -213
  101. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -61
  102. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
  103. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
  104. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
  105. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
  106. data/lib/net/ssh/transport/kex.rb +15 -12
  107. data/lib/net/ssh/transport/key_expander.rb +24 -20
  108. data/lib/net/ssh/transport/openssl.rb +161 -124
  109. data/lib/net/ssh/transport/openssl_cipher_extensions.rb +8 -0
  110. data/lib/net/ssh/transport/packet_stream.rb +246 -185
  111. data/lib/net/ssh/transport/server_version.rb +55 -56
  112. data/lib/net/ssh/transport/session.rb +306 -255
  113. data/lib/net/ssh/transport/state.rb +178 -176
  114. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  115. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  116. data/lib/net/ssh/verifiers/always.rb +58 -0
  117. data/lib/net/ssh/verifiers/never.rb +19 -0
  118. data/lib/net/ssh/version.rb +55 -53
  119. data/lib/net/ssh.rb +111 -47
  120. data/net-ssh-public_cert.pem +18 -18
  121. data/net-ssh.gemspec +38 -205
  122. data/support/ssh_tunnel_bug.rb +5 -5
  123. data.tar.gz.sig +0 -0
  124. metadata +173 -118
  125. metadata.gz.sig +0 -0
  126. data/.travis.yml +0 -18
  127. data/README.rdoc +0 -182
  128. data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
  129. data/lib/net/ssh/authentication/agent/socket.rb +0 -178
  130. data/lib/net/ssh/ruby_compat.rb +0 -46
  131. data/lib/net/ssh/verifiers/lenient.rb +0 -30
  132. data/lib/net/ssh/verifiers/null.rb +0 -12
  133. data/lib/net/ssh/verifiers/secure.rb +0 -52
  134. data/lib/net/ssh/verifiers/strict.rb +0 -24
  135. data/setup.rb +0 -1585
  136. data/support/arcfour_check.rb +0 -20
  137. data/test/README.txt +0 -18
  138. data/test/authentication/methods/common.rb +0 -28
  139. data/test/authentication/methods/test_abstract.rb +0 -51
  140. data/test/authentication/methods/test_hostbased.rb +0 -114
  141. data/test/authentication/methods/test_keyboard_interactive.rb +0 -121
  142. data/test/authentication/methods/test_none.rb +0 -41
  143. data/test/authentication/methods/test_password.rb +0 -95
  144. data/test/authentication/methods/test_publickey.rb +0 -148
  145. data/test/authentication/test_agent.rb +0 -232
  146. data/test/authentication/test_key_manager.rb +0 -240
  147. data/test/authentication/test_session.rb +0 -107
  148. data/test/common.rb +0 -125
  149. data/test/configs/auth_off +0 -5
  150. data/test/configs/auth_on +0 -4
  151. data/test/configs/empty +0 -0
  152. data/test/configs/eqsign +0 -3
  153. data/test/configs/exact_match +0 -8
  154. data/test/configs/host_plus +0 -10
  155. data/test/configs/multihost +0 -4
  156. data/test/configs/negative_match +0 -6
  157. data/test/configs/nohost +0 -19
  158. data/test/configs/numeric_host +0 -4
  159. data/test/configs/proxy_remote_user +0 -2
  160. data/test/configs/send_env +0 -2
  161. data/test/configs/substitutes +0 -8
  162. data/test/configs/wild_cards +0 -14
  163. data/test/connection/test_channel.rb +0 -487
  164. data/test/connection/test_session.rb +0 -564
  165. data/test/integration/README.txt +0 -17
  166. data/test/integration/Vagrantfile +0 -12
  167. data/test/integration/common.rb +0 -63
  168. data/test/integration/playbook.yml +0 -56
  169. data/test/integration/test_forward.rb +0 -637
  170. data/test/integration/test_id_rsa_keys.rb +0 -96
  171. data/test/integration/test_proxy.rb +0 -93
  172. data/test/known_hosts/github +0 -1
  173. data/test/known_hosts/github_hash +0 -1
  174. data/test/manual/test_pageant.rb +0 -37
  175. data/test/start/test_connection.rb +0 -53
  176. data/test/start/test_options.rb +0 -57
  177. data/test/start/test_transport.rb +0 -28
  178. data/test/start/test_user_nil.rb +0 -27
  179. data/test/test_all.rb +0 -12
  180. data/test/test_buffer.rb +0 -433
  181. data/test/test_buffered_io.rb +0 -63
  182. data/test/test_config.rb +0 -268
  183. data/test/test_key_factory.rb +0 -191
  184. data/test/test_known_hosts.rb +0 -66
  185. data/test/transport/hmac/test_md5.rb +0 -41
  186. data/test/transport/hmac/test_md5_96.rb +0 -27
  187. data/test/transport/hmac/test_none.rb +0 -34
  188. data/test/transport/hmac/test_ripemd160.rb +0 -36
  189. data/test/transport/hmac/test_sha1.rb +0 -36
  190. data/test/transport/hmac/test_sha1_96.rb +0 -27
  191. data/test/transport/hmac/test_sha2_256.rb +0 -37
  192. data/test/transport/hmac/test_sha2_256_96.rb +0 -27
  193. data/test/transport/hmac/test_sha2_512.rb +0 -37
  194. data/test/transport/hmac/test_sha2_512_96.rb +0 -27
  195. data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
  196. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -150
  197. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -96
  198. data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -19
  199. data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
  200. data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
  201. data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
  202. data/test/transport/test_algorithms.rb +0 -328
  203. data/test/transport/test_cipher_factory.rb +0 -443
  204. data/test/transport/test_hmac.rb +0 -34
  205. data/test/transport/test_identity_cipher.rb +0 -40
  206. data/test/transport/test_packet_stream.rb +0 -1762
  207. data/test/transport/test_server_version.rb +0 -74
  208. data/test/transport/test_session.rb +0 -331
  209. data/test/transport/test_state.rb +0 -181
  210. 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 identity_agent 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,9 @@ 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
195
+ # * :identity_agent => the path to the ssh-agent's UNIX socket
184
196
  # * :verbose => how verbose to be (Logger verbosity constants, Logger::DEBUG
185
197
  # is very verbose, Logger::FATAL is all but silent). Logger::FATAL is the
186
198
  # default. The symbols :debug, :info, :warn, :error, and :fatal are also
@@ -190,49 +202,61 @@ module Net
190
202
  # * :number_of_password_prompts => Number of prompts for the password
191
203
  # authentication method defaults to 3 set to 0 to disable prompt for
192
204
  # 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
205
+ # * :password_prompt => a custom prompt object with ask method. See Net::SSH::Prompt
206
+ #
195
207
  # * :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') })
208
+ # Net::SSH.start(host,user,agent_socket_factory: ->{ UNIXSocket.open('/foo/bar') })
197
209
  # example: ->{ UNIXSocket.open('/foo/bar')}
198
- #
210
+ # * :verify_host_key => specify how strict host-key verification should be.
211
+ # In order of increasing strictness:
212
+ # * :never (very insecure) ::Net::SSH::Verifiers::Never
213
+ # * :accept_new_or_local_tunnel (insecure) ::Net::SSH::Verifiers::AcceptNewOrLocalTunnel
214
+ # * :accept_new (insecure) ::Net::SSH::Verifiers::AcceptNew
215
+ # * :always (secure) ::Net::SSH::Verifiers::Always
216
+ # You can also provide an own Object which responds to +verify+. The argument
217
+ # given to +verify+ is a hash consisting of the +:key+, the +:key_blob+,
218
+ # the +:fingerprint+ and the +:session+. Returning true accepts the host key,
219
+ # returning false declines it and closes the connection.
220
+ # * :fingerprint_hash => 'MD5' or 'SHA256', defaults to 'SHA256'
199
221
  # If +user+ parameter is nil it defaults to USER from ssh_config, or
200
222
  # local username
201
- def self.start(host, user=nil, options={}, &block)
223
+ def self.start(host, user = nil, options = {}, &block)
202
224
  invalid_options = options.keys - VALID_OPTIONS
203
225
  if invalid_options.any?
204
226
  raise ArgumentError, "invalid option(s): #{invalid_options.join(', ')}"
205
227
  end
206
228
 
229
+ assign_defaults(options)
230
+ _sanitize_options(options)
231
+
207
232
  options[:user] = user if user
208
233
  options = configuration_for(host, options.fetch(:config, true)).merge(options)
209
234
  host = options.fetch(:host_name, host)
210
235
 
211
- if !options.key?(:logger)
212
- options[:logger] = Logger.new(STDERR)
213
- options[:logger].level = Logger::FATAL
214
- end
236
+ options[:check_host_ip] = true unless options.key?(:check_host_ip)
215
237
 
216
238
  if options[:non_interactive]
217
239
  options[:number_of_password_prompts] = 0
218
240
  end
219
241
 
242
+ _support_deprecated_option_paranoid(options)
243
+
220
244
  if options[:verbose]
221
245
  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
246
+ when Integer then options[:verbose]
247
+ when :debug then Logger::DEBUG
248
+ when :info then Logger::INFO
249
+ when :warn then Logger::WARN
250
+ when :error then Logger::ERROR
251
+ when :fatal then Logger::FATAL
252
+ else raise ArgumentError, "can't convert #{options[:verbose].inspect} to any of the Logger level constants"
253
+ end
230
254
  end
231
255
 
232
256
  transport = Transport::Session.new(host, options)
233
257
  auth = Authentication::Session.new(transport, options)
234
258
 
235
- user = options.fetch(:user, user) || Etc.getlogin
259
+ user = options.fetch(:user, user) || Etc.getpwuid.name
236
260
  if auth.authenticate("ssh-connection", user, options[:password])
237
261
  connection = Connection::Session.new(transport, options)
238
262
  if block_given?
@@ -259,14 +283,54 @@ module Net
259
283
  # to read.
260
284
  #
261
285
  # See Net::SSH::Config for the full description of all supported options.
262
- def self.configuration_for(host, use_ssh_config=true)
286
+ def self.configuration_for(host, use_ssh_config)
263
287
  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
288
+ when true then Net::SSH::Config.expandable_default_files
289
+ when false, nil then return {}
290
+ else Array(use_ssh_config)
291
+ end
268
292
 
269
293
  Net::SSH::Config.for(host, files)
270
294
  end
295
+
296
+ def self.assign_defaults(options)
297
+ if !options[:logger]
298
+ options[:logger] = Logger.new(STDERR)
299
+ options[:logger].level = Logger::FATAL
300
+ end
301
+
302
+ options[:password_prompt] ||= Prompt.default(options)
303
+
304
+ %i[password passphrase].each do |key|
305
+ options.delete(key) if options.key?(key) && options[key].nil?
306
+ end
307
+ end
308
+
309
+ def self._sanitize_options(options)
310
+ invalid_option_values = [nil, [nil]]
311
+ unless (options.values & invalid_option_values).empty?
312
+ nil_options = options.select { |_k, v| invalid_option_values.include?(v) }.map(&:first)
313
+ Kernel.warn "#{caller_locations(2, 1)[0]}: Passing nil, or [nil] to Net::SSH.start is deprecated for keys: #{nil_options.join(', ')}"
314
+ end
315
+ end
316
+ private_class_method :_sanitize_options
317
+
318
+ def self._support_deprecated_option_paranoid(options)
319
+ if options.key?(:paranoid)
320
+ Kernel.warn(
321
+ ":paranoid is deprecated, please use :verify_host_key. Supported " \
322
+ "values are exactly the same, only the name of the option has changed."
323
+ )
324
+ if options.key?(:verify_host_key)
325
+ Kernel.warn(
326
+ "Both :paranoid and :verify_host_key were specified. " \
327
+ ":verify_host_key takes precedence, :paranoid will be ignored."
328
+ )
329
+ else
330
+ options[:verify_host_key] = options.delete(:paranoid)
331
+ end
332
+ end
333
+ end
334
+ private_class_method :_support_deprecated_option_paranoid
271
335
  end
272
336
  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,46 @@
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 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"
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(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
- s.authors = ["Jamis Buck", "Delano Mandelbaum", "Mikl\u{f3}s Fazekas"]
14
- s.cert_chain = ["net-ssh-public_cert.pem"]
15
- s.date = "2016-06-19"
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.6"
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('rbnacl', '~> 7.1') unless ENV['NET_SSH_NO_RBNACL']
40
+
41
+ spec.add_development_dependency "bundler", ">= 1.17"
42
+ spec.add_development_dependency "minitest", "~> 5.10"
43
+ spec.add_development_dependency "mocha", "~> 1.11.2"
44
+ spec.add_development_dependency "rake", "~> 12.0"
45
+ spec.add_development_dependency "rubocop", "~> 1.28.0"
46
+ 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