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,178 +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 for managing popen3 requests for remote processes.
25
- class POpen3Manager
26
-
27
- # Create a new POpen3Manager instance on the given connection.
28
- def initialize( connection, log )
29
- @connection = connection
30
- @log = log
31
- end
32
-
33
- # Invokes the given command synchronously on the current connection.
34
- # (This means that parallel commands and operations cannot be
35
- # executed when this method is used.) This will return +nil+ if the
36
- # method could not be executed. If the command is successfully
37
- # invoked, and a block is given, the block is then invoked with the
38
- # input, output, and error streams of the command as parameters, and
39
- # the channel is closed as soon as the block terminates. If a block
40
- # is not given, the input, output, and error channels are returned
41
- # and the process *might* not terminate until the session itself
42
- # terminates.
43
- def popen3( command )
44
- @connection.open_channel( "session" ) do |chan|
45
-
46
- chan.on_success do |ch|
47
- input = SSHStdinPipe.new( ch )
48
- output = SSHStdoutPipe.new( ch )
49
- error = SSHStderrPipe.new( ch )
50
-
51
- if block_given?
52
- yield input, output, error
53
- chan.close
54
- else
55
- return [ input, output, error ]
56
- end
57
- end
58
-
59
- chan.on_failure do |ch|
60
- chan.close
61
- end
62
-
63
- chan.exec command, true
64
- end
65
-
66
- @connection.loop
67
- return nil
68
- end
69
-
70
- # A specialized class for use by the Net::SSH "popen3" service.
71
- # An instance of this class represents a means of writing data to an
72
- # SSH channel. This class should never be instantiated directly; use
73
- # the popen3 method instead.
74
- class SSHStdinPipe
75
-
76
- # The channel used by this pipe.
77
- attr_reader :channel
78
-
79
- # Create a new +stdin+ pipe on the given channel.
80
- def initialize( channel )
81
- @channel = channel
82
- end
83
-
84
- # Write the given data as channel data to the underlying channel.
85
- def write( data )
86
- @channel.send_data data
87
- @channel.connection.process true
88
- end
89
-
90
- # Write the given data as channel data to the underlying channel,
91
- # appending a newline character (if one isn't already appended).
92
- def puts( data )
93
- write data.chomp + "\n"
94
- end
95
-
96
- end
97
-
98
- # An abstract class representing a writable stream on a channel. This
99
- # is subclassed by SSHStdoutPipe and SSHStderrPipe.
100
- class SSHOutputPipe
101
-
102
- # The channel used by this pipe.
103
- attr_reader :channel
104
-
105
- # Create a new output pipe on the given channel.
106
- def initialize( channel )
107
- @channel = channel
108
- @data = ""
109
- end
110
-
111
- # Returns true if there are any bytes available on this pipe. This
112
- # will do a non-blocking read on the connection to determine if
113
- # there
114
- def data_available?
115
- if @data.length == 0
116
- connection = @channel.connection
117
- connection.process while connection.reader_ready?
118
- end
119
- @data.length > 0
120
- end
121
-
122
- # Read all available bytes from the pipe. If there are no available
123
- # bytes, then this will block until data becomes available.
124
- def read
125
- if @data.length < 1
126
- @channel.connection.process while @data.length < 1
127
- end
128
-
129
- data, @data = @data, ""
130
- return data
131
- end
132
-
133
- end
134
-
135
- # A specialization of SSHOutputPipe that represents specifically the
136
- # +stdout+ stream of a process. It should only be used by popen3.
137
- class SSHStdoutPipe < SSHOutputPipe
138
-
139
- # Create a new +stdout+ stream on the given channel. Only one such
140
- # pipe should ever be associated with a channel.
141
- def initialize( channel )
142
- super( channel )
143
- channel.on_data(&method(:do_data))
144
- end
145
-
146
- # Invoked when data is recieved from the channel. It simply
147
- # accumulates all data until a +read+ is invoked.
148
- def do_data( channel, data )
149
- @data << data
150
- end
151
-
152
- end
153
-
154
- # A specialization of SSHOutputPipe that represents specifically the
155
- # +stderr+ stream of a process. It should only be used by popen3.
156
- class SSHStderrPipe < SSHOutputPipe
157
-
158
- # Create a new +stderr+ stream on the given channel. Only one such
159
- # pipe should ever be associated with a channel.
160
- def initialize( channel )
161
- super( channel )
162
- channel.on_extended_data(&method(:do_data))
163
- end
164
-
165
- # Invoked when data is recieved from the channel. It simply
166
- # accumulates all data until a +read+ is invoked.
167
- def do_data( channel, type, data )
168
- @data << data if type == 1
169
- end
170
-
171
- end
172
-
173
- end
174
-
175
- end # module Process
176
- end # module Service
177
- end # module SSH
178
- end # module Net
@@ -1,66 +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 Process
21
-
22
- # Register all services pertaining to the management of remote
23
- # processes.
24
- def register_services( container )
25
-
26
- # All process management services are registered in their own
27
- # namespace.
28
- container.namespace_define :process do |ns|
29
-
30
- # The :open_manager service returns a proc object that can be used
31
- # to create new OpenManager instances for a given command.
32
- ns.open_manager do |c,p|
33
- require 'net/ssh/service/process/open'
34
- connection = c[:connection][:driver]
35
- log = c[:log_for, p]
36
- lambda { |cmd| OpenManager.new( connection, log, cmd ) }
37
- end
38
-
39
- # The :popen3_manager service returns a new POpen3Manager instance
40
- # for managing the execution of commands with a popen3-type
41
- # interface.
42
- ns.popen3_manager do |c,p|
43
- require 'net/ssh/service/process/popen3'
44
- connection = c[:connection][:driver]
45
- log = c[:log_for, p]
46
- POpen3Manager.new( connection, log )
47
- end
48
-
49
- # The :driver controls access to all remote process management
50
- # services.
51
- ns.driver do |c,p|
52
- require 'net/ssh/service/process/driver'
53
- Driver.new( c[:connection][:driver],
54
- c[:log_for, p],
55
- :open => c[:open_manager],
56
- :popen3 => c[:popen3_manager] )
57
- end
58
-
59
- end
60
- end
61
- module_function :register_services
62
-
63
- end
64
- end
65
- end
66
- end
@@ -1,60 +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'
18
-
19
- module Net
20
- module SSH
21
- module Service
22
-
23
- # Register all standard SSH services.
24
- def register_services( container )
25
-
26
- # Define the hash that will be used to record the registered services.
27
- # If the hash already exists, don't redefine it.
28
- unless container.knows_key?( :services )
29
- container.define.services { Hash.new }
30
- end
31
-
32
- # Register the services in their own namespace.
33
- container.namespace_define :service do |ns|
34
- ns.require "net/ssh/service/forward/services", "#{self}::Forward"
35
- ns.require "net/ssh/service/process/services", "#{self}::Process"
36
- ns.require "net/ssh/service/shell/services", "#{self}::Shell"
37
- ns.require "net/ssh/service/agentforward/services", "#{self}::AgentForward"
38
- end
39
-
40
- # Add the services to the services hash.
41
- container.services[ :forward ] = container.service.forward.driver
42
- container.services[ :process ] = container.service.process.driver
43
- container.services[ :shell ] = container.service.shell.driver
44
- container.services[ :agentforward ] = container.service.agentforward.driver
45
-
46
- # Register the external services and add them to the collection of
47
- # known services.
48
- EXTERNAL_SERVICES.each do |name, block|
49
- container.service.register( name,
50
- :model => :singleton_deferred,
51
- &block )
52
- container.services[ name ] = container.service[ name ]
53
- end
54
-
55
- end
56
- module_function :register_services
57
-
58
- end
59
- end
60
- end
@@ -1,86 +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 Shell
21
-
22
- # The service driver for the Shell service. It manages the creation of
23
- # new Shell::Shell and Shell::SyncShell subservices.
24
- #
25
- # Usage:
26
- #
27
- # Net::SSH.start( host ) do |session|
28
- # shell = session.shell.open
29
- #
30
- # shell.cd "/home/foo"
31
- # shell.mkdir "-p some/long/dir"
32
- # shell.cd "some/long/dir"
33
- # shell.touch "foo.txt"
34
- # shell.exit
35
- #
36
- # session.loop
37
- # end
38
- #
39
- # Or:
40
- #
41
- # Net::SSH.start( host ) do |session|
42
- # shell = session.shell.sync
43
- #
44
- # shell.cd "/home/foo"
45
- #
46
- # out = shell.test "-e some/file.txt"
47
- # if out.status == 0
48
- # out = shell.cat "some/file.txt"
49
- # puts out.stdout
50
- # else
51
- # puts "no such file 'some/file.txt'"
52
- # end
53
- #
54
- # end
55
- class Driver
56
-
57
- # Create a new driver with the given logger and shell and
58
- # sync factories.
59
- def initialize( log, shell_factory, sync_factory )
60
- @log = log
61
- @shell_factory = shell_factory
62
- @sync_factory = sync_factory
63
- end
64
-
65
- # Open a new shell, using the Shell::Shell subservice and
66
- # the given options.
67
- def open( options={} )
68
- pty_opts = options[:pty]
69
-
70
- @shell_factory.call( pty_opts )
71
- end
72
-
73
- # Open a new shell, using the Shell::SyncShell subservice and
74
- # the given options.
75
- def sync( options={} )
76
- pty_opts = options[:pty]
77
-
78
- @sync_factory.call( pty_opts )
79
- end
80
-
81
- end
82
-
83
- end # Shell
84
- end # Service
85
- end # SSH
86
- end # Net
@@ -1,54 +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 Shell
21
-
22
- def register_services( container )
23
-
24
- container.namespace_define :shell do |ns|
25
-
26
- ns.shell do |c,p|
27
- require 'net/ssh/service/shell/shell'
28
- connection = c[:connection][:driver]
29
- log = c[:log_for, p]
30
- lambda { |pty| Shell.new( connection, log, pty ) }
31
- end
32
-
33
- ns.sync do |c,p|
34
- require 'net/ssh/service/shell/sync'
35
- connection = c[:connection][:driver]
36
- log = c[:log_for, p]
37
- shell = c[:shell]
38
- lambda { |pty| SyncShell.new( shell, log, pty ) }
39
- end
40
-
41
- ns.driver do |c,p|
42
- require 'net/ssh/service/shell/driver'
43
- Driver.new( c[:log_for, p], c[:shell], c[:sync] )
44
- end
45
-
46
- end
47
-
48
- end
49
- module_function :register_services
50
-
51
- end
52
- end
53
- end
54
- end
@@ -1,222 +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 'stringio'
18
- require 'net/ssh/errors'
19
-
20
- module Net
21
- module SSH
22
- module Service
23
- module Shell
24
-
25
- class OpenFailed < Net::SSH::Exception; end
26
-
27
- # A service class for interacting with a user's shell on a remote
28
- # machine. The shell may be interacted with either with or without a
29
- # pty.
30
- class Shell
31
-
32
- # Create a new shell over the given connection. The +pty_opts+
33
- # parameter must be either a Hash of the allowed values for the
34
- # Net::SSH::Connection::Channel#request_pty method, or a boolean
35
- # value (indicating whether a pty should be allocated or not). This
36
- # will block until the shell is open and ready to receive input.
37
- def initialize( connection, log, pty_opts )
38
- @connection = connection
39
- @log = log
40
-
41
- @pty_opts = pty_opts
42
-
43
- @stdout = ""
44
- @stderr = ""
45
-
46
- @state = :opening
47
- @connection.open_channel( "session", &method( :on_confirm ) )
48
-
49
- @connection.loop { @state != :open && @state != :closed }
50
- raise "could not open shell" if @state != :open
51
- end
52
-
53
- # Returns +true+ if the shell is open.
54
- def open?
55
- @state == :open
56
- end
57
-
58
- # Return the stdout output (if any) that the shell has generated
59
- # since the last time this method was invoked.
60
- def stdout
61
- string, @stdout = @stdout, ""
62
- string
63
- end
64
-
65
- # Returns +true+ if there is any data from the shell on stdout,
66
- # consuming input on the connection in a non-blocking manner to make
67
- # sure that any available data is considered.
68
- def stdout?
69
- exists = @stdout.length > 0
70
- unless exists
71
- consume_connection
72
- exists = @stdout.length > 0
73
- end
74
- exists
75
- end
76
-
77
- # Return the stderr output (if any) that the shell has generated
78
- # since the last time this method was invoked.
79
- def stderr
80
- string, @stderr = @stderr, ""
81
- string
82
- end
83
-
84
- # Returns +true+ if there is any data from the shell on stderr,
85
- # consuming input on the connection in a non-blocking manner to make
86
- # sure that any available data is considered.
87
- def stderr?
88
- exists = @stderr.length > 0
89
- unless exists
90
- consume_connection
91
- exists = @stderr.length > 0
92
- end
93
- exists
94
- end
95
-
96
- # Sends the given data to the shell on the shell's stdin stream.
97
- def send_data( data )
98
- raise "channel not open" unless @state == :open
99
- @channel.send_data data
100
- end
101
-
102
- # Sends the given data to the shell on the stream indicated by the
103
- # +type+ parameter.
104
- def send_extended_data( type, data )
105
- raise "channel not open" unless @state == :open
106
- @channel.send_extended_data type, data
107
- end
108
-
109
- # Reinterprets method invocations as requests to send data to the
110
- # shell. The method name and the arguments are concatenated together
111
- # with spaces and a newline appended. The resulting string is sent
112
- # to the shell via #send_data.
113
- def method_missing( sym, *args )
114
- cmd = sym.to_s
115
- cmd << " " << args.join( " " ) unless args.empty?
116
- send_data cmd + "\n"
117
- end
118
-
119
- undef_method :exit
120
-
121
- private
122
-
123
- # Consumes all available input on the connection.
124
- def consume_connection
125
- return unless @channel
126
- connection = @channel.connection
127
- connection.process while connection.reader_ready?
128
- end
129
-
130
- # Invoked when the channel has been confirmed.
131
- def on_confirm( channel )
132
- @channel = channel
133
-
134
- @channel.on_confirm_failed( &method( :on_confirm_failed ) )
135
- @channel.on_close( &method( :on_close ) )
136
- @channel.on_data( &method( :on_data ) )
137
- @channel.on_eof( &method( :on_eof ) )
138
- @channel.on_extended_data( &method( :on_extended_data ) )
139
- @channel.on_request( &method( :on_request ) )
140
- @channel.on_failure( &method( :on_failure ) )
141
- @channel.on_success( &method( :on_success ) )
142
-
143
- @pty_opts ? request_pty : request_shell
144
- end
145
-
146
- # Request a pty from the server for this channel, using the
147
- # parameters given when the service was started.
148
- def request_pty
149
- @state = :pty
150
- pty_opts = { :want_reply=>true }
151
- pty_opts = @pty_opts.merge( pty_opts ) if @pty_opts.is_a?( Hash )
152
- @channel.request_pty pty_opts
153
- end
154
-
155
- # Request that the user's shell be started on this channel. All
156
- # subsequent input to the channel is interpreted as input to the
157
- # shell.
158
- def request_shell
159
- @state = :shell
160
- @channel.send_request "shell", nil, true
161
- end
162
-
163
- # Called when the channel could not be opened for some reason.
164
- def on_confirm_failed( channel, reason, description, *args )
165
- raise OpenFailed, "#{reason} (#{description})"
166
- end
167
-
168
- # Invoked when the channel closes. Changes the shell's state to
169
- # closed.
170
- def on_close( channel )
171
- @state = :closed
172
- end
173
-
174
- # Invoked when data is received over the channel. It is written
175
- # to the stdout stream.
176
- def on_data( channel, data )
177
- @stdout << data if @state == :open
178
- end
179
-
180
- # Invoked when the channel receives an eof notification. (Not
181
- # currently used.)
182
- def on_eof( channel )
183
- end
184
-
185
- # Invoked when extended data (stderr) is recieved. If type == 1,
186
- # this data is written to the stderr stream; otherwise, it is
187
- # ignored.
188
- def on_extended_data( channel, type, data )
189
- @stderr << data if @state == :open && type == 1
190
- end
191
-
192
- # Invoked when a request is received over the channel. (Not
193
- # currently used.)
194
- def on_request( channel, request, want_reply, data )
195
- end
196
-
197
- # Invoked when a request fails. Currently, this is only used in
198
- # response to the pty or shell request, and will close the shell
199
- # in reponse.
200
- def on_failure( channel )
201
- if @state == :pty || @state == :shell
202
- @state = :closed
203
- end
204
- end
205
-
206
- # Invoked when a request succeeds. Currently used only to manage
207
- # the state machine and make sure that the shell gets opened after
208
- # a successful pty request.
209
- def on_success( channel )
210
- if @state == :pty
211
- request_shell
212
- elsif @state == :shell
213
- @state = :open
214
- end
215
- end
216
-
217
- end
218
-
219
- end # Shell
220
- end # Service
221
- end # SSH
222
- end # Net