net-ssh 1.1.4 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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