net-ssh 1.1.4 → 2.0.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 (297) hide show
  1. data/CHANGELOG.rdoc +37 -0
  2. data/Manifest +101 -0
  3. data/README.rdoc +110 -0
  4. data/Rakefile +26 -0
  5. data/{THANKS → THANKS.rdoc} +2 -5
  6. data/lib/net/ssh.rb +189 -57
  7. data/lib/net/ssh/authentication/agent.rb +175 -0
  8. data/lib/net/ssh/authentication/constants.rb +18 -0
  9. data/lib/net/ssh/authentication/key_manager.rb +166 -0
  10. data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
  11. data/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
  12. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
  13. data/lib/net/ssh/authentication/methods/password.rb +39 -0
  14. data/lib/net/ssh/authentication/methods/publickey.rb +92 -0
  15. data/lib/net/ssh/authentication/pageant.rb +176 -0
  16. data/lib/net/ssh/authentication/session.rb +116 -0
  17. data/lib/net/ssh/buffer.rb +339 -0
  18. data/lib/net/ssh/buffered_io.rb +149 -0
  19. data/lib/net/ssh/config.rb +173 -0
  20. data/lib/net/ssh/connection/channel.rb +575 -454
  21. data/lib/net/ssh/connection/constants.rb +31 -45
  22. data/lib/net/ssh/connection/session.rb +569 -0
  23. data/lib/net/ssh/connection/term.rb +176 -88
  24. data/lib/net/ssh/errors.rb +83 -61
  25. data/lib/net/ssh/key_factory.rb +85 -0
  26. data/lib/net/ssh/known_hosts.rb +129 -0
  27. data/lib/net/ssh/loggable.rb +61 -0
  28. data/lib/net/ssh/packet.rb +102 -0
  29. data/lib/net/ssh/prompt.rb +93 -0
  30. data/lib/net/ssh/proxy/errors.rb +8 -28
  31. data/lib/net/ssh/proxy/http.rb +75 -107
  32. data/lib/net/ssh/proxy/socks4.rb +35 -48
  33. data/lib/net/ssh/proxy/socks5.rb +76 -108
  34. data/lib/net/ssh/service/forward.rb +267 -0
  35. data/lib/net/ssh/test.rb +89 -0
  36. data/lib/net/ssh/test/channel.rb +129 -0
  37. data/lib/net/ssh/test/extensions.rb +152 -0
  38. data/lib/net/ssh/test/kex.rb +44 -0
  39. data/lib/net/ssh/test/local_packet.rb +51 -0
  40. data/lib/net/ssh/test/packet.rb +81 -0
  41. data/lib/net/ssh/test/remote_packet.rb +38 -0
  42. data/lib/net/ssh/test/script.rb +157 -0
  43. data/lib/net/ssh/test/socket.rb +59 -0
  44. data/lib/net/ssh/transport/algorithms.rb +384 -0
  45. data/lib/net/ssh/transport/cipher_factory.rb +72 -0
  46. data/lib/net/ssh/transport/constants.rb +22 -58
  47. data/lib/net/ssh/transport/hmac.rb +31 -0
  48. data/lib/net/ssh/transport/hmac/abstract.rb +48 -0
  49. data/lib/net/ssh/transport/hmac/md5.rb +12 -0
  50. data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
  51. data/lib/net/ssh/transport/hmac/none.rb +15 -0
  52. data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
  53. data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
  54. data/lib/net/ssh/transport/identity_cipher.rb +40 -0
  55. data/lib/net/ssh/transport/kex.rb +13 -0
  56. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
  57. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
  58. data/lib/net/ssh/{util → transport}/openssl.rb +22 -40
  59. data/lib/net/ssh/transport/packet_stream.rb +230 -0
  60. data/lib/net/ssh/transport/server_version.rb +61 -0
  61. data/lib/net/ssh/transport/session.rb +225 -303
  62. data/lib/net/ssh/transport/state.rb +170 -0
  63. data/lib/net/ssh/verifiers/lenient.rb +30 -0
  64. data/lib/net/ssh/verifiers/null.rb +12 -0
  65. data/lib/net/ssh/verifiers/strict.rb +53 -0
  66. data/lib/net/ssh/version.rb +57 -26
  67. data/net-ssh.gemspec +54 -0
  68. data/setup.rb +1585 -0
  69. data/test/authentication/methods/common.rb +28 -0
  70. data/test/authentication/methods/test_abstract.rb +51 -0
  71. data/test/authentication/methods/test_hostbased.rb +108 -0
  72. data/test/authentication/methods/test_keyboard_interactive.rb +98 -0
  73. data/test/authentication/methods/test_password.rb +50 -0
  74. data/test/authentication/methods/test_publickey.rb +123 -0
  75. data/test/authentication/test_agent.rb +205 -0
  76. data/test/authentication/test_key_manager.rb +100 -0
  77. data/test/authentication/test_session.rb +93 -0
  78. data/test/common.rb +106 -0
  79. data/test/configs/exact_match +8 -0
  80. data/test/configs/wild_cards +14 -0
  81. data/test/connection/test_channel.rb +452 -0
  82. data/test/connection/test_session.rb +483 -0
  83. data/test/test_all.rb +6 -0
  84. data/test/test_buffer.rb +336 -0
  85. data/test/test_buffered_io.rb +63 -0
  86. data/test/test_config.rb +78 -0
  87. data/test/test_key_factory.rb +67 -0
  88. data/test/transport/hmac/test_md5.rb +34 -0
  89. data/test/transport/hmac/test_md5_96.rb +25 -0
  90. data/test/transport/hmac/test_none.rb +34 -0
  91. data/test/transport/hmac/test_sha1.rb +34 -0
  92. data/test/transport/hmac/test_sha1_96.rb +25 -0
  93. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
  94. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
  95. data/test/transport/test_algorithms.rb +302 -0
  96. data/test/transport/test_cipher_factory.rb +163 -0
  97. data/test/transport/test_hmac.rb +34 -0
  98. data/test/transport/test_identity_cipher.rb +40 -0
  99. data/test/transport/test_packet_stream.rb +433 -0
  100. data/test/transport/test_server_version.rb +55 -0
  101. data/test/transport/test_session.rb +312 -0
  102. data/test/transport/test_state.rb +173 -0
  103. metadata +102 -253
  104. data/ChangeLog +0 -560
  105. data/LICENSE +0 -7
  106. data/NEWS +0 -152
  107. data/README +0 -14
  108. data/bin/rb-keygen +0 -210
  109. data/doc/LICENSE-BSD +0 -27
  110. data/doc/LICENSE-GPL +0 -280
  111. data/doc/LICENSE-RUBY +0 -56
  112. data/doc/manual-html/chapter-1.html +0 -388
  113. data/doc/manual-html/chapter-2.html +0 -552
  114. data/doc/manual-html/chapter-3.html +0 -470
  115. data/doc/manual-html/chapter-4.html +0 -413
  116. data/doc/manual-html/chapter-5.html +0 -525
  117. data/doc/manual-html/chapter-6.html +0 -456
  118. data/doc/manual-html/chapter-7.html +0 -343
  119. data/doc/manual-html/index.html +0 -235
  120. data/doc/manual-html/stylesheets/manual.css +0 -270
  121. data/doc/manual-html/stylesheets/ruby.css +0 -17
  122. data/doc/manual/chapter.erb +0 -38
  123. data/doc/manual/example.erb +0 -18
  124. data/doc/manual/index.erb +0 -29
  125. data/doc/manual/manual.rb +0 -311
  126. data/doc/manual/manual.yml +0 -73
  127. data/doc/manual/page.erb +0 -87
  128. data/doc/manual/parts/0000.txt +0 -5
  129. data/doc/manual/parts/0001.txt +0 -3
  130. data/doc/manual/parts/0002.txt +0 -40
  131. data/doc/manual/parts/0003.txt +0 -6
  132. data/doc/manual/parts/0004.txt +0 -7
  133. data/doc/manual/parts/0005.txt +0 -1
  134. data/doc/manual/parts/0006.txt +0 -49
  135. data/doc/manual/parts/0007.txt +0 -67
  136. data/doc/manual/parts/0008.txt +0 -43
  137. data/doc/manual/parts/0009.txt +0 -14
  138. data/doc/manual/parts/0010.txt +0 -7
  139. data/doc/manual/parts/0011.txt +0 -14
  140. data/doc/manual/parts/0012.txt +0 -3
  141. data/doc/manual/parts/0013.txt +0 -20
  142. data/doc/manual/parts/0014.txt +0 -32
  143. data/doc/manual/parts/0015.txt +0 -14
  144. data/doc/manual/parts/0016.txt +0 -28
  145. data/doc/manual/parts/0017.txt +0 -50
  146. data/doc/manual/parts/0018.txt +0 -35
  147. data/doc/manual/parts/0019.txt +0 -7
  148. data/doc/manual/parts/0020.txt +0 -72
  149. data/doc/manual/parts/0021.txt +0 -50
  150. data/doc/manual/parts/0022.txt +0 -42
  151. data/doc/manual/parts/0023.txt +0 -51
  152. data/doc/manual/parts/0024.txt +0 -18
  153. data/doc/manual/parts/0025.txt +0 -18
  154. data/doc/manual/parts/0026.txt +0 -15
  155. data/doc/manual/parts/0027.txt +0 -37
  156. data/doc/manual/parts/0028.txt +0 -16
  157. data/doc/manual/parts/0029.txt +0 -1
  158. data/doc/manual/parts/0030.txt +0 -52
  159. data/doc/manual/parts/0031.txt +0 -25
  160. data/doc/manual/stylesheets/manual.css +0 -270
  161. data/doc/manual/stylesheets/ruby.css +0 -17
  162. data/doc/manual/tutorial.erb +0 -30
  163. data/examples/auth-forward.rb +0 -41
  164. data/examples/channel-demo.rb +0 -81
  165. data/examples/port-forward.rb +0 -51
  166. data/examples/process-demo.rb +0 -91
  167. data/examples/remote-net-port-forward.rb +0 -45
  168. data/examples/remote-port-forward.rb +0 -80
  169. data/examples/shell-demo.rb +0 -46
  170. data/examples/ssh-client.rb +0 -67
  171. data/examples/sync-shell-demo.rb +0 -69
  172. data/examples/tail-demo.rb +0 -49
  173. data/lib/net/ssh/connection/driver.rb +0 -446
  174. data/lib/net/ssh/connection/services.rb +0 -72
  175. data/lib/net/ssh/host-key-verifier.rb +0 -52
  176. data/lib/net/ssh/known-hosts.rb +0 -96
  177. data/lib/net/ssh/lenient-host-key-verifier.rb +0 -25
  178. data/lib/net/ssh/null-host-key-verifier.rb +0 -14
  179. data/lib/net/ssh/service/agentforward/driver.rb +0 -78
  180. data/lib/net/ssh/service/agentforward/services.rb +0 -41
  181. data/lib/net/ssh/service/forward/driver.rb +0 -319
  182. data/lib/net/ssh/service/forward/local-network-handler.rb +0 -71
  183. data/lib/net/ssh/service/forward/remote-network-handler.rb +0 -83
  184. data/lib/net/ssh/service/forward/services.rb +0 -76
  185. data/lib/net/ssh/service/process/driver.rb +0 -153
  186. data/lib/net/ssh/service/process/open.rb +0 -193
  187. data/lib/net/ssh/service/process/popen3.rb +0 -178
  188. data/lib/net/ssh/service/process/services.rb +0 -66
  189. data/lib/net/ssh/service/services.rb +0 -60
  190. data/lib/net/ssh/service/shell/driver.rb +0 -86
  191. data/lib/net/ssh/service/shell/services.rb +0 -54
  192. data/lib/net/ssh/service/shell/shell.rb +0 -222
  193. data/lib/net/ssh/service/shell/sync.rb +0 -114
  194. data/lib/net/ssh/session.rb +0 -305
  195. data/lib/net/ssh/transport/algorithm-negotiator.rb +0 -275
  196. data/lib/net/ssh/transport/compress/compressor.rb +0 -53
  197. data/lib/net/ssh/transport/compress/decompressor.rb +0 -53
  198. data/lib/net/ssh/transport/compress/none-compressor.rb +0 -39
  199. data/lib/net/ssh/transport/compress/none-decompressor.rb +0 -39
  200. data/lib/net/ssh/transport/compress/services.rb +0 -68
  201. data/lib/net/ssh/transport/compress/zlib-compressor.rb +0 -60
  202. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +0 -52
  203. data/lib/net/ssh/transport/errors.rb +0 -47
  204. data/lib/net/ssh/transport/identity-cipher.rb +0 -61
  205. data/lib/net/ssh/transport/kex/dh-gex.rb +0 -106
  206. data/lib/net/ssh/transport/kex/dh.rb +0 -249
  207. data/lib/net/ssh/transport/kex/services.rb +0 -62
  208. data/lib/net/ssh/transport/ossl/buffer-factory.rb +0 -52
  209. data/lib/net/ssh/transport/ossl/buffer.rb +0 -87
  210. data/lib/net/ssh/transport/ossl/cipher-factory.rb +0 -98
  211. data/lib/net/ssh/transport/ossl/digest-factory.rb +0 -51
  212. data/lib/net/ssh/transport/ossl/hmac-factory.rb +0 -71
  213. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +0 -62
  214. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +0 -44
  215. data/lib/net/ssh/transport/ossl/hmac/md5.rb +0 -46
  216. data/lib/net/ssh/transport/ossl/hmac/none.rb +0 -46
  217. data/lib/net/ssh/transport/ossl/hmac/services.rb +0 -68
  218. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +0 -44
  219. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +0 -45
  220. data/lib/net/ssh/transport/ossl/key-factory.rb +0 -116
  221. data/lib/net/ssh/transport/ossl/services.rb +0 -149
  222. data/lib/net/ssh/transport/packet-stream.rb +0 -236
  223. data/lib/net/ssh/transport/services.rb +0 -146
  224. data/lib/net/ssh/transport/version-negotiator.rb +0 -73
  225. data/lib/net/ssh/userauth/agent.rb +0 -222
  226. data/lib/net/ssh/userauth/constants.rb +0 -35
  227. data/lib/net/ssh/userauth/driver.rb +0 -183
  228. data/lib/net/ssh/userauth/methods/hostbased.rb +0 -119
  229. data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +0 -104
  230. data/lib/net/ssh/userauth/methods/password.rb +0 -70
  231. data/lib/net/ssh/userauth/methods/publickey.rb +0 -137
  232. data/lib/net/ssh/userauth/methods/services.rb +0 -90
  233. data/lib/net/ssh/userauth/pageant.rb +0 -197
  234. data/lib/net/ssh/userauth/services.rb +0 -141
  235. data/lib/net/ssh/userauth/userkeys.rb +0 -258
  236. data/lib/net/ssh/util/buffer.rb +0 -274
  237. data/lib/net/ssh/util/prompter.rb +0 -73
  238. data/test/ALL-TESTS.rb +0 -18
  239. data/test/connection/tc_channel.rb +0 -136
  240. data/test/connection/tc_driver.rb +0 -287
  241. data/test/connection/tc_integration.rb +0 -87
  242. data/test/proxy/tc_http.rb +0 -209
  243. data/test/proxy/tc_socks4.rb +0 -148
  244. data/test/proxy/tc_socks5.rb +0 -214
  245. data/test/service/agentforward/tc_driver.rb +0 -138
  246. data/test/service/forward/tc_driver.rb +0 -289
  247. data/test/service/forward/tc_local_network_handler.rb +0 -123
  248. data/test/service/forward/tc_remote_network_handler.rb +0 -111
  249. data/test/service/process/tc_driver.rb +0 -79
  250. data/test/service/process/tc_integration.rb +0 -119
  251. data/test/service/process/tc_open.rb +0 -179
  252. data/test/service/process/tc_popen3.rb +0 -164
  253. data/test/tc_integration.rb +0 -80
  254. data/test/transport/compress/tc_none_compress.rb +0 -41
  255. data/test/transport/compress/tc_none_decompress.rb +0 -45
  256. data/test/transport/compress/tc_zlib_compress.rb +0 -61
  257. data/test/transport/compress/tc_zlib_decompress.rb +0 -48
  258. data/test/transport/kex/tc_dh.rb +0 -312
  259. data/test/transport/kex/tc_dh_gex.rb +0 -71
  260. data/test/transport/ossl/fixtures/dsa-encrypted +0 -15
  261. data/test/transport/ossl/fixtures/dsa-encrypted-bad +0 -15
  262. data/test/transport/ossl/fixtures/dsa-unencrypted +0 -12
  263. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +0 -12
  264. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +0 -1
  265. data/test/transport/ossl/fixtures/not-a-private-key +0 -4
  266. data/test/transport/ossl/fixtures/not-supported +0 -2
  267. data/test/transport/ossl/fixtures/rsa-encrypted +0 -18
  268. data/test/transport/ossl/fixtures/rsa-encrypted-bad +0 -18
  269. data/test/transport/ossl/fixtures/rsa-unencrypted +0 -15
  270. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +0 -15
  271. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +0 -1
  272. data/test/transport/ossl/hmac/tc_hmac.rb +0 -58
  273. data/test/transport/ossl/hmac/tc_md5.rb +0 -50
  274. data/test/transport/ossl/hmac/tc_md5_96.rb +0 -50
  275. data/test/transport/ossl/hmac/tc_none.rb +0 -50
  276. data/test/transport/ossl/hmac/tc_sha1.rb +0 -50
  277. data/test/transport/ossl/hmac/tc_sha1_96.rb +0 -50
  278. data/test/transport/ossl/tc_buffer.rb +0 -97
  279. data/test/transport/ossl/tc_buffer_factory.rb +0 -67
  280. data/test/transport/ossl/tc_cipher_factory.rb +0 -84
  281. data/test/transport/ossl/tc_digest_factory.rb +0 -39
  282. data/test/transport/ossl/tc_hmac_factory.rb +0 -72
  283. data/test/transport/ossl/tc_key_factory.rb +0 -199
  284. data/test/transport/tc_algorithm_negotiator.rb +0 -170
  285. data/test/transport/tc_identity_cipher.rb +0 -52
  286. data/test/transport/tc_integration.rb +0 -115
  287. data/test/transport/tc_packet_stream.rb +0 -184
  288. data/test/transport/tc_session.rb +0 -296
  289. data/test/transport/tc_version_negotiator.rb +0 -86
  290. data/test/userauth/methods/tc_hostbased.rb +0 -136
  291. data/test/userauth/methods/tc_password.rb +0 -89
  292. data/test/userauth/methods/tc_publickey.rb +0 -167
  293. data/test/userauth/tc_agent.rb +0 -223
  294. data/test/userauth/tc_driver.rb +0 -190
  295. data/test/userauth/tc_integration.rb +0 -97
  296. data/test/userauth/tc_userkeys.rb +0 -265
  297. data/test/util/tc_buffer.rb +0 -217
@@ -1,71 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- module Net
18
- module SSH
19
- module Service
20
- module Forward
21
-
22
- # This is a utility class used internally by Forward::Driver. It
23
- # manages the network server instance for each locally forwarded port,
24
- # and is passed as the handler to Driver#direct_channel by
25
- # Forward::Driver#forward_local. Other clients may desire to extend
26
- # this class and pass the modified class to
27
- # Forward::Driver#direct_channel for their own purposes, but in general
28
- # this class will rarely be used outside of Forward::Driver.
29
- class LocalNetworkHandler
30
-
31
- # Create a new LocalNetworkHandler for the given client connection.
32
- def initialize( log, block_size, client )
33
- @log = log
34
- @block_size = block_size
35
- @client = client
36
- end
37
-
38
- # Invoked when data is recieved from the channel. This method just
39
- # sends the data to the client connection.
40
- def on_receive( channel, data )
41
- @client.send data, 0
42
- end
43
-
44
- # Invoked when the remote end of the channel will no longer be
45
- # sending data. It may still receive data, however.
46
- def on_eof( channel )
47
- channel[:eof] = true
48
- end
49
-
50
- # Called to process the channel in a loop. It will repeatedly read
51
- # from the client and send the results across the channel.
52
- def process( channel )
53
- loop do
54
- break if channel[:eof]
55
- data = @client.recv(@block_size) or break
56
- channel.send_data data unless data.empty?
57
- end
58
-
59
- channel.close
60
- rescue StandardError, Exception => e
61
- @log.error "error processing connection: " +
62
- "#{e.class} (#{e.message})\n " +
63
- e.backtrace.join("\n ")
64
- end
65
-
66
- end
67
-
68
- end # Forward
69
- end # Service
70
- end # SSH
71
- end # Net
@@ -1,83 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- require 'socket'
18
-
19
- module Net
20
- module SSH
21
- module Service
22
- module Forward
23
-
24
- # A helper class for managing ports forwarded from a remote host to
25
- # the local host.
26
- class RemoteNetworkHandler
27
-
28
- # Instantiate a new RemoteNetworkHandler instance that will forward
29
- # data to the given local port and host address.
30
- def initialize( log, block_size, local_port, local_host='127.0.0.1' )
31
- @log = log
32
- @block_size = block_size
33
- @local_port = local_port
34
- @local_host = local_host
35
- end
36
-
37
- # Opens a new socket to the local host and port given when the
38
- # handler was created, and forwards data from the channel to that
39
- # connection.
40
- def on_open( channel, c_addr, c_port, o_addr, o_port )
41
- @client = TCPSocket.new( @local_host, @local_port )
42
-
43
- Thread.new do
44
- begin
45
- loop do
46
- break if channel[:eof]
47
- data = ""
48
- while IO.select([@client],nil,nil,0.01)
49
- data << @client.recv(@block_size)
50
- end
51
- channel.send_data data unless data.empty?
52
- end
53
- rescue Exception => e
54
- @log.error "error while forwarding remote port: " +
55
- "#{e.class}: #{e.message}\n " +
56
- e.backtrace.join( "\n " )
57
- ensure
58
- channel.close
59
- end
60
- end
61
- end
62
-
63
- # Invoked when the channel indicates that the end is near.
64
- def on_eof( channel )
65
- channel[:eof] = true
66
- end
67
-
68
- # Invoked when the channel is closed.
69
- def on_close( channel )
70
- @client.shutdown
71
- end
72
-
73
- # Invoked when data is received over the channel.
74
- def on_receive( channel, data )
75
- @client.send data, 0
76
- end
77
-
78
- end
79
-
80
- end
81
- end
82
- end
83
- end
@@ -1,76 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- module Net
18
- module SSH
19
- module Service
20
- module Forward
21
-
22
- # Register the services pertaining to port forwarding.
23
- def register_services( container )
24
-
25
- # All port forwarding services go in the :forward namespace.
26
- container.namespace_define :forward do |ns|
27
-
28
- # The :driver service manages all port forwarding. It is declared
29
- # as deferred so that it is not actually instantiated until it is
30
- # used--otherwise, it would be instantiated as soon as it was added
31
- # to the list of available services, whether it was ever used or
32
- # not.
33
- ns.driver :model => :singleton_deferred do |c,p|
34
- require 'net/ssh/service/forward/driver'
35
- Driver.new( c[:connection][:driver],
36
- c[:transport][:buffers],
37
- c[:log_for, p],
38
- :local => c[:local_network_handler],
39
- :remote => c[:remote_network_handler] )
40
- end
41
-
42
- # A constant service, used to indicate the maximum block size to be
43
- # passed over a forwarded connection.
44
- ns.read_block_size { 64 * 1024 }
45
-
46
- # The :local_network_handler service returns a proc object that
47
- # creates new LocalNetworkHandler instances for a given client
48
- # connection. This is used for forwarding ports on the local host.
49
- ns.local_network_handler :model => :singleton_deferred do |c,p|
50
- require 'net/ssh/service/forward/local-network-handler'
51
- log = c[:log_for, p]
52
- block_size = c[:read_block_size]
53
- lambda do |client|
54
- LocalNetworkHandler.new( log, block_size, client )
55
- end
56
- end
57
-
58
- # The :remote_network_handler service returns a proc object that
59
- # creates new RemoteNetworkHandler instances for a given port and
60
- # host. This is used for forwarding ports on a remote host.
61
- ns.remote_network_handler :model => :singleton_deferred do |c,p|
62
- require 'net/ssh/service/forward/remote-network-handler'
63
- log = c[:log_for, p]
64
- block_size = c[:read_block_size]
65
- lambda do |port, host|
66
- RemoteNetworkHandler.new( log, block_size, port, host )
67
- end
68
- end
69
- end
70
- end
71
- module_function :register_services
72
-
73
- end
74
- end
75
- end
76
- end
@@ -1,153 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- require 'net/ssh/errors'
18
-
19
- module Net
20
- module SSH
21
- module Service
22
- module Process
23
-
24
- # Represents a process executing on the remote machine. It also provides
25
- # a simple interface for interacting with such a remote process.
26
- #
27
- # It may be used in either of two ways. The first allows multiple
28
- # processes to be invoked on the remote machine and run in parallel
29
- # over the same session. Because of this, it is a bit complicated to
30
- # set up:
31
- #
32
- # require 'net/ssh'
33
- #
34
- # Net::SSH.start( 'host', 'user', 'passwd' ) do |session|
35
- # process = session.process.open( "bc" )
36
- # dialog = [ "5+5", "7*12", "1+2*5/(7+3)" ]
37
- #
38
- # process.on_success do |p|
39
- # puts "requesting computation of '#{dialog.first}'"
40
- # p.puts dialog.shift
41
- # end
42
- #
43
- # process.on_failure do |p, status|
44
- # puts "process failed to start (#{status})"
45
- # end
46
- #
47
- # process.on_stdout do |p, data|
48
- # puts "--> #{data}"
49
- # if dialog.empty?
50
- # p.close_input
51
- # else
52
- # puts "requesting computation of '#{dialog.first}'"
53
- # p.puts dialog.shift
54
- # end
55
- # end
56
- #
57
- # process.on_stderr do |p, data|
58
- # puts "[stderr]--> #{data}"
59
- # end
60
- #
61
- # process.on_exit do |p, status|
62
- # puts "process finished with exit status: #{status}"
63
- # end
64
- #
65
- # session.loop
66
- # end
67
- #
68
- # Naturally, not all of the callbacks used above are required. If you
69
- # omit any of them, they will simply not be called. However, you
70
- # *should* do something when the process is successfully started
71
- # (+on_success+), and you *should* do something when data is recieved
72
- # over stdout (+on_stdout+). Lastly, you *must* execute
73
- # <tt>session.loop</tt> in order to process the connection.
74
- #
75
- # The simpler way to use this service is only available when you
76
- # are not handling multiple parallel processes--you can only use it
77
- # when the process you are executing is the only task you are using the
78
- # SSH connection for. It is reminiscent of the popen interface: you
79
- # invoke a command and get three pseudo-IO objects back--one for the
80
- # command's "stdin" stream, one for it's "stdout" stream, and one for
81
- # it's "stderr" stream. You may then write to the "stdin" stream, and
82
- # read from the "stdout" and "stderr" streams.
83
- #
84
- # For example:
85
- #
86
- # require 'net/ssh'
87
- #
88
- # Net::SSH.start( 'host', 'user', 'passwd' ) do |session|
89
- # input, output, error = session.process.popen3( "bc" )
90
- # input.puts "5+5"
91
- # puts "5+5=#{output.read}"
92
- # input.puts "7*12"
93
- # puts "7*12=#{output.read}"
94
- # input.puts "1+2*5/(7+3)"
95
- # puts "1+2*5/(7+3)=#{output.read}"
96
- # input.puts "quit"
97
- # end
98
- #
99
- # One caveat with this format: the process cannot be explicitly
100
- # terminated from the client side--the process must terminate on its
101
- # own (for example, by recieving a "quit" command, as used above). If
102
- # the command does not support any means of gracefully aborting it,
103
- # then the only way to kill the command is to terminate the connection.
104
- #
105
- # A slightly cleaner approach uses blocks to denote the lifespan of the
106
- # process. When the block terminates, the process is killed (if it is
107
- # still running):
108
- #
109
- # require 'net/ssh'
110
- #
111
- # Net::SSH.start( 'host', 'user', 'passwd' ) do |session|
112
- # session.process.popen3( "cat" ) do |input, output, error|
113
- # input.puts "hello"
114
- # puts "echo: #{output.read}"
115
- # input.puts "world"
116
- # puts "echo: #{output.read}"
117
- # end
118
- # end
119
- class Driver
120
-
121
- # Create a new Driver instance, using the given log and handlers
122
- # hash.
123
- def initialize( connection, log, handlers )
124
- @connection = connection
125
- @log = log
126
- @handlers = handlers
127
- end
128
-
129
- def open( command )
130
- @log.debug "opening '#{command}'" if @log.debug?
131
- process = @handlers[ :open ].call( command )
132
-
133
- if block_given?
134
- yield process
135
- @connection.loop
136
- return nil
137
- end
138
-
139
- process
140
- end
141
-
142
- def popen3( command, &block )
143
- @log.debug "popen3 '#{command}'" if @log.debug?
144
- mgr = @handlers[ :popen3 ]
145
- mgr.popen3( command, &block )
146
- end
147
-
148
- end
149
-
150
- end # module Process
151
- end # module Service
152
- end # module SSH
153
- end # module Net
@@ -1,193 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- require 'net/ssh/errors'
18
-
19
- module Net
20
- module SSH
21
- module Service
22
- module Process
23
-
24
- # A delegate class to manage the processing for a single executed
25
- # process on the remote host. It opens a channel, executes the process
26
- # on it, and manages the various callbacks.
27
- #
28
- # This service is typically used like this:
29
- #
30
- # Net::SSH.start( 'host', 'user' ) do |session|
31
- # session.process.open( "bc" ) do |process|
32
- # ...
33
- # end
34
- # end
35
- class OpenManager
36
-
37
- # Create a new OpenManager instance on the given connection. It will
38
- # attempt to execute the given command. If a block is given, the
39
- # manager will be yielded to the block, and the constructor will not
40
- # return until all channels are closed.
41
- def initialize( connection, log, command )
42
- @log = log
43
- @command = command
44
- @channel = connection.open_channel(
45
- "session", &method( :do_confirm ) )
46
-
47
- if block_given?
48
- yield self
49
- connection.loop
50
- end
51
- end
52
-
53
- # Register the given block to be invoked when the command has been
54
- # confirmed to have been successfully started. The block should
55
- # accept a single parameter, the process instance that was created
56
- # (+self+).
57
- def on_success( &block )
58
- @on_success = block
59
- end
60
-
61
- # Register the given block to be invoked when the command could not
62
- # be started. The block should accept two parameters: the process
63
- # instance (+self+) and a status string. (The status string is
64
- # currently always +nil+, since SSH itself does not indicate why the
65
- # program failed to start.)
66
- def on_failure( &block )
67
- @on_failure = block
68
- end
69
-
70
- # Register the given block to be invoked when data is recieved from
71
- # the invoked command's +stdout+ stream. The block should accept two
72
- # parameters: the process instance (+self+) and the data string. Note
73
- # that if the process sends large amounts of data, this method may be
74
- # invoked multiple times, each time with a portion of the command's
75
- # output.
76
- def on_stdout( &block )
77
- @on_stdout = block
78
- end
79
-
80
- # Register the given block to be invoked when data is recieved from
81
- # the invoked command's +stderr+ stream. The block should accept two
82
- # parameters: the process instance (+self+) and the data string. Note
83
- # that if the process sends large amounts of data, this method may be
84
- # invoked multiple times, each time with a portion of the command's
85
- # error output.
86
- def on_stderr( &block )
87
- @on_stderr = block
88
- end
89
-
90
- # Register the given block to be invoked when the process terminates
91
- # normally. The block should accept two parameters: the process
92
- # instance (+self+) and the exit status of the process.
93
- def on_exit( &block )
94
- @on_exit = block
95
- end
96
-
97
- # Send the given data to the process. It will be sent via the
98
- # process's +stdin+ stream. This method returns immediately.
99
- def write( data )
100
- @channel.send_data data
101
- end
102
-
103
- # Send the given data to the process, appending a newline. As with
104
- # Kernel::puts, this will not append a newline if the string already
105
- # has one. See #write.
106
- def puts( data )
107
- @channel.send_data data.chomp + "\n"
108
- end
109
-
110
- # Indicate that no more data will be sent to the process (sends an
111
- # EOF to the process). The process may continue to send data, but
112
- # the +stdin+ stream is effectively closed. This will return
113
- # immediately.
114
- def close_input
115
- @channel.send_eof
116
- end
117
-
118
- # Close the process. All streams (+stdin+, +stdout+, +stderr+) will
119
- # be closed. Any output that the process had already produced will
120
- # still be sent, but it will be shut down as soon as possible. This
121
- # will return immediately.
122
- def close
123
- @channel.close
124
- end
125
-
126
- # Invoked when the channel's opening has been confirmed by the
127
- # server. This is where the command to execute will be sent to the
128
- # server.
129
- def do_confirm( channel )
130
- channel.on_success(&method(:do_exec_success))
131
- channel.on_failure(&method(:do_exec_failure))
132
- channel.exec @command, true
133
- end
134
-
135
- # Invoked when the invocation of the command has been successful.
136
- # This registers various callbacks, and then calls the +on_success+
137
- # callback (if registered).
138
- def do_exec_success( channel )
139
- channel.on_data(&method(:do_data))
140
- channel.on_extended_data(&method(:do_extended_data))
141
- channel.on_close(&method(:do_close))
142
- channel.on_request(&method(:do_request))
143
- @on_success.call( self ) if @on_success
144
- end
145
-
146
- # Invoked when the invocation of the command failed. This will call
147
- # the +on_failure+ callback, if registered, or will otherwise raise
148
- # an exception.
149
- def do_exec_failure( channel )
150
- if @on_failure
151
- @on_failure.call( self, nil )
152
- else
153
- raise Net::SSH::Exception,
154
- "could not execute process (#{@command})"
155
- end
156
- end
157
-
158
- # Invoked when data arrives over the channel. This simply delegates to
159
- # the +on_stdout+ callback, if registered.
160
- def do_data( channel, data )
161
- @on_stdout.call( self, data ) if @on_stdout
162
- end
163
-
164
- # Invoked when extended data arrives over the channel. This simply
165
- # delegates to the +on_stderr+ callback, if registered, if the type
166
- # is 1; otherwise it does nothing.
167
- def do_extended_data( channel, type, data )
168
- case type
169
- when 1
170
- @on_stderr.call( self, data ) if @on_stderr
171
- end
172
- end
173
-
174
- # Invoked when the channel is closed. This simply delegates to
175
- # the +on_exit+ callback, if registered.
176
- def do_close( channel )
177
- @on_exit.call( self, @exit_status ) if @on_exit
178
- end
179
-
180
- # Invoked when a channel request is received.
181
- def do_request( channel, type, want_reply, data )
182
- case type
183
- when "exit-status"
184
- @exit_status = data.read_long
185
- end
186
- end
187
-
188
- end
189
-
190
- end # module Process
191
- end # module Service
192
- end # module SSH
193
- end # module Net