net-ssh 0.6.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. data/doc/manual-html/chapter-1.html +59 -24
  2. data/doc/manual-html/chapter-2.html +116 -77
  3. data/doc/manual-html/chapter-3.html +80 -41
  4. data/doc/manual-html/chapter-4.html +111 -71
  5. data/doc/manual-html/chapter-5.html +267 -155
  6. data/doc/manual-html/chapter-6.html +211 -75
  7. data/doc/manual-html/chapter-7.html +331 -0
  8. data/doc/manual-html/index.html +39 -13
  9. data/doc/manual-html/{manual.css → stylesheets/manual.css} +81 -8
  10. data/doc/manual-html/stylesheets/ruby.css +17 -0
  11. data/doc/manual/chapter.erb +20 -0
  12. data/doc/manual/manual.rb +80 -9
  13. data/doc/manual/manual.yml +12 -2
  14. data/doc/manual/page.erb +1 -1
  15. data/doc/manual/parts/channels_callbacks.txt +11 -11
  16. data/doc/manual/parts/channels_loop.txt +6 -6
  17. data/doc/manual/parts/channels_open.txt +9 -9
  18. data/doc/manual/parts/exec_channels.txt +15 -15
  19. data/doc/manual/parts/exec_open.txt +17 -18
  20. data/doc/manual/parts/exec_popen3.txt +18 -18
  21. data/doc/manual/parts/forward_direct.txt +16 -16
  22. data/doc/manual/parts/forward_intro.txt +7 -7
  23. data/doc/manual/parts/forward_local.txt +9 -9
  24. data/doc/manual/parts/forward_remote.txt +9 -9
  25. data/doc/manual/parts/intro_getting.txt +11 -11
  26. data/doc/manual/parts/proxy_http.txt +27 -27
  27. data/doc/manual/parts/proxy_socks.txt +17 -17
  28. data/doc/manual/parts/session_key.txt +13 -14
  29. data/doc/manual/parts/session_options.txt +14 -14
  30. data/doc/manual/parts/session_session.txt +9 -9
  31. data/doc/manual/parts/session_start.txt +27 -27
  32. data/doc/manual/parts/shells_channels.txt +72 -0
  33. data/doc/manual/parts/shells_clients.txt +51 -0
  34. data/doc/manual/parts/shells_intro.txt +7 -0
  35. data/doc/manual/parts/shells_shell.txt +50 -0
  36. data/doc/manual/parts/shells_sync.txt +42 -0
  37. data/doc/manual/{manual.css → stylesheets/manual.css} +81 -8
  38. data/doc/manual/stylesheets/ruby.css +17 -0
  39. data/examples/channel-demo.rb +1 -1
  40. data/examples/port-forward.rb +1 -1
  41. data/examples/process-demo.rb +1 -1
  42. data/examples/remote-net-port-forward.rb +1 -1
  43. data/examples/remote-port-forward.rb +1 -1
  44. data/examples/shell-demo.rb +46 -0
  45. data/examples/ssh-client.rb +67 -0
  46. data/examples/sync-shell-demo.rb +69 -0
  47. data/examples/tail-demo.rb +1 -1
  48. data/lib/net/ssh.rb +1 -1
  49. data/lib/net/ssh/connection/channel.rb +61 -7
  50. data/lib/net/ssh/connection/constants.rb +1 -1
  51. data/lib/net/ssh/connection/driver.rb +61 -8
  52. data/lib/net/ssh/connection/services.rb +1 -1
  53. data/lib/net/ssh/connection/term.rb +1 -1
  54. data/lib/net/ssh/errors.rb +1 -1
  55. data/lib/net/ssh/proxy/errors.rb +1 -1
  56. data/lib/net/ssh/proxy/http.rb +1 -1
  57. data/lib/net/ssh/proxy/socks4.rb +1 -1
  58. data/lib/net/ssh/proxy/socks5.rb +1 -1
  59. data/lib/net/ssh/service/forward/driver.rb +1 -1
  60. data/lib/net/ssh/service/forward/local-network-handler.rb +1 -1
  61. data/lib/net/ssh/service/forward/remote-network-handler.rb +1 -1
  62. data/lib/net/ssh/service/forward/services.rb +1 -1
  63. data/lib/net/ssh/service/process/driver.rb +1 -1
  64. data/lib/net/ssh/service/process/open.rb +1 -1
  65. data/lib/net/ssh/service/process/popen3.rb +20 -2
  66. data/lib/net/ssh/service/process/services.rb +1 -1
  67. data/lib/net/ssh/service/services.rb +3 -1
  68. data/lib/net/ssh/service/shell/driver.rb +86 -0
  69. data/lib/net/ssh/service/shell/services.rb +54 -0
  70. data/lib/net/ssh/service/shell/shell.rb +213 -0
  71. data/lib/net/ssh/service/shell/sync.rb +114 -0
  72. data/lib/net/ssh/session.rb +9 -1
  73. data/lib/net/ssh/transport/algorithm-negotiator.rb +1 -1
  74. data/lib/net/ssh/transport/compress/compressor.rb +1 -1
  75. data/lib/net/ssh/transport/compress/decompressor.rb +1 -1
  76. data/lib/net/ssh/transport/compress/none-compressor.rb +1 -1
  77. data/lib/net/ssh/transport/compress/none-decompressor.rb +1 -1
  78. data/lib/net/ssh/transport/compress/services.rb +1 -1
  79. data/lib/net/ssh/transport/compress/zlib-compressor.rb +1 -1
  80. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +1 -1
  81. data/lib/net/ssh/transport/constants.rb +1 -1
  82. data/lib/net/ssh/transport/errors.rb +1 -1
  83. data/lib/net/ssh/transport/identity-cipher.rb +1 -1
  84. data/lib/net/ssh/transport/kex/dh-gex.rb +1 -1
  85. data/lib/net/ssh/transport/kex/dh.rb +1 -1
  86. data/lib/net/ssh/transport/kex/services.rb +1 -1
  87. data/lib/net/ssh/transport/ossl/buffer-factory.rb +1 -1
  88. data/lib/net/ssh/transport/ossl/buffer.rb +1 -1
  89. data/lib/net/ssh/transport/ossl/cipher-factory.rb +1 -1
  90. data/lib/net/ssh/transport/ossl/digest-factory.rb +1 -1
  91. data/lib/net/ssh/transport/ossl/hmac-factory.rb +1 -1
  92. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +1 -1
  93. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +1 -1
  94. data/lib/net/ssh/transport/ossl/hmac/md5.rb +1 -1
  95. data/lib/net/ssh/transport/ossl/hmac/none.rb +1 -1
  96. data/lib/net/ssh/transport/ossl/hmac/services.rb +1 -1
  97. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +1 -1
  98. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +1 -1
  99. data/lib/net/ssh/transport/ossl/key-factory.rb +5 -2
  100. data/lib/net/ssh/transport/ossl/services.rb +1 -1
  101. data/lib/net/ssh/transport/packet-stream.rb +1 -1
  102. data/lib/net/ssh/transport/services.rb +1 -1
  103. data/lib/net/ssh/transport/session.rb +10 -1
  104. data/lib/net/ssh/transport/version-negotiator.rb +1 -1
  105. data/lib/net/ssh/userauth/agent.rb +1 -1
  106. data/lib/net/ssh/userauth/constants.rb +1 -1
  107. data/lib/net/ssh/userauth/driver.rb +1 -1
  108. data/lib/net/ssh/userauth/methods/hostbased.rb +1 -1
  109. data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +104 -0
  110. data/lib/net/ssh/userauth/methods/password.rb +1 -1
  111. data/lib/net/ssh/userauth/methods/publickey.rb +1 -1
  112. data/lib/net/ssh/userauth/methods/services.rb +28 -6
  113. data/lib/net/ssh/userauth/services.rb +8 -5
  114. data/lib/net/ssh/userauth/userkeys.rb +1 -1
  115. data/lib/net/ssh/util/buffer.rb +1 -1
  116. data/lib/net/ssh/util/openssl.rb +1 -1
  117. data/lib/net/ssh/util/prompter.rb +1 -1
  118. data/lib/net/ssh/version.rb +2 -2
  119. data/test/ALL-TESTS.rb +1 -1
  120. data/test/connection/tc_channel.rb +1 -1
  121. data/test/connection/tc_driver.rb +1 -1
  122. data/test/connection/tc_integration.rb +1 -1
  123. data/test/proxy/tc_http.rb +1 -1
  124. data/test/proxy/tc_socks4.rb +1 -1
  125. data/test/proxy/tc_socks5.rb +1 -1
  126. data/test/service/forward/tc_driver.rb +1 -1
  127. data/test/service/forward/tc_local_network_handler.rb +1 -1
  128. data/test/service/forward/tc_remote_network_handler.rb +1 -1
  129. data/test/service/process/tc_driver.rb +1 -1
  130. data/test/service/process/tc_integration.rb +1 -1
  131. data/test/service/process/tc_open.rb +1 -1
  132. data/test/service/process/tc_popen3.rb +13 -13
  133. data/test/tc_integration.rb +1 -1
  134. data/test/transport/compress/tc_none_compress.rb +1 -1
  135. data/test/transport/compress/tc_none_decompress.rb +1 -1
  136. data/test/transport/compress/tc_zlib_compress.rb +1 -1
  137. data/test/transport/compress/tc_zlib_decompress.rb +1 -1
  138. data/test/transport/kex/tc_dh.rb +2 -1
  139. data/test/transport/kex/tc_dh_gex.rb +1 -1
  140. data/test/transport/ossl/hmac/tc_hmac.rb +1 -1
  141. data/test/transport/ossl/hmac/tc_md5.rb +1 -1
  142. data/test/transport/ossl/hmac/tc_md5_96.rb +1 -1
  143. data/test/transport/ossl/hmac/tc_none.rb +1 -1
  144. data/test/transport/ossl/hmac/tc_sha1.rb +1 -1
  145. data/test/transport/ossl/hmac/tc_sha1_96.rb +1 -1
  146. data/test/transport/ossl/tc_buffer.rb +1 -1
  147. data/test/transport/ossl/tc_buffer_factory.rb +1 -1
  148. data/test/transport/ossl/tc_cipher_factory.rb +1 -1
  149. data/test/transport/ossl/tc_digest_factory.rb +1 -1
  150. data/test/transport/ossl/tc_hmac_factory.rb +1 -1
  151. data/test/transport/ossl/tc_key_factory.rb +1 -1
  152. data/test/transport/tc_algorithm_negotiator.rb +1 -1
  153. data/test/transport/tc_identity_cipher.rb +1 -1
  154. data/test/transport/tc_integration.rb +1 -1
  155. data/test/transport/tc_packet_stream.rb +1 -1
  156. data/test/transport/tc_session.rb +1 -1
  157. data/test/transport/tc_version_negotiator.rb +1 -1
  158. data/test/userauth/methods/tc_hostbased.rb +1 -1
  159. data/test/userauth/methods/tc_password.rb +1 -1
  160. data/test/userauth/methods/tc_publickey.rb +1 -1
  161. data/test/userauth/tc_agent.rb +1 -1
  162. data/test/userauth/tc_driver.rb +1 -1
  163. data/test/userauth/tc_integration.rb +15 -1
  164. data/test/userauth/tc_userkeys.rb +1 -1
  165. data/test/util/tc_buffer.rb +5 -5
  166. metadata +26 -6
@@ -0,0 +1,17 @@
1
+ .ruby .normal {}
2
+ .ruby .comment { color: #005; font-style: italic; }
3
+ .ruby .keyword { color: #A00; font-weight: bold; }
4
+ .ruby .method { color: #077; }
5
+ .ruby .class { color: #074; }
6
+ .ruby .module { color: #050; }
7
+ .ruby .punct { color: #447; font-weight: bold; }
8
+ .ruby .symbol { color: #099; }
9
+ .ruby .string { color: #944; }
10
+ .ruby .char { color: #F07; }
11
+ .ruby .ident { color: #004; }
12
+ .ruby .constant { color: #07F; }
13
+ .ruby .regex { color: #B66; }
14
+ .ruby .number { color: #D55; }
15
+ .ruby .attribute { color: #377; }
16
+ .ruby .global { color: #3B7; }
17
+ .ruby .expr { color: #227; }
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
@@ -0,0 +1,46 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
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
+ $:.unshift "../lib"
18
+ require 'net/ssh'
19
+
20
+ Net::SSH.start( 'localhost' ) do |session|
21
+
22
+ shell = session.shell.open
23
+
24
+ # script what we want to do
25
+ shell.pwd
26
+ shell.cd "/"
27
+ shell.pwd
28
+ shell.test "-e foo"
29
+ shell.ls "-laZ"
30
+ shell.cd "/really/bogus/directory"
31
+ shell.send_data "/sbin/ifconfig\n"
32
+ shell.pwd
33
+ shell.ruby "-v"
34
+ shell.cd "/usr/lib"
35
+ shell.pwd
36
+ shell.exit
37
+
38
+ # give the above commands sufficient time to terminate
39
+ sleep 0.5
40
+
41
+ # display the output
42
+ $stdout.print shell.stdout while shell.stdout?
43
+ $stderr.puts "-- stderr: --"
44
+ $stderr.print shell.stderr while shell.stderr?
45
+
46
+ end
@@ -0,0 +1,67 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
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
+ # This is a (very) simple, but capable, SSH terminal client. It DOES NOT send
18
+ # the size of the terminal window, or handle resizing of the terminal window.
19
+
20
+ $:.unshift "../lib"
21
+ require 'net/ssh'
22
+
23
+ begin
24
+ require 'termios'
25
+ rescue LoadError
26
+ end
27
+
28
+ def stdin_buffer( enable )
29
+ return unless defined?( Termios )
30
+ attr = Termios::getattr( $stdin )
31
+ if enable
32
+ attr.c_lflag |= Termios::ICANON | Termios::ECHO
33
+ else
34
+ attr.c_lflag &= ~(Termios::ICANON|Termios::ECHO)
35
+ end
36
+ Termios::setattr( $stdin, Termios::TCSANOW, attr )
37
+ end
38
+
39
+ host = ARGV.shift or abort "You must specify the [user@]host to connect to"
40
+ if host =~ /@/
41
+ user, host = host.match( /(.*?)@(.*)/ )[1,2]
42
+ else
43
+ user = ENV['USER'] || ENV['USER_NAME']
44
+ end
45
+
46
+ Net::SSH.start( host, user ) do |session|
47
+
48
+ begin
49
+ stdin_buffer false
50
+
51
+ shell = session.shell.open( :pty => true )
52
+
53
+ loop do
54
+ break unless shell.open?
55
+ if IO.select([$stdin],nil,nil,0.01)
56
+ data = $stdin.sysread(1)
57
+ shell.send_data data
58
+ end
59
+
60
+ $stdout.print shell.stdout while shell.stdout?
61
+ $stdout.flush
62
+ end
63
+ ensure
64
+ stdin_buffer true
65
+ end
66
+
67
+ end
@@ -0,0 +1,69 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
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
+ $:.unshift "../lib"
18
+ require 'net/ssh'
19
+
20
+ Net::SSH.start( 'localhost' ) do |session|
21
+
22
+ shell = session.shell.sync
23
+
24
+ out = shell.pwd
25
+ p out.stdout
26
+
27
+ out = shell.cd "/"
28
+
29
+ out = shell.pwd
30
+ p out.stdout
31
+
32
+ out = shell.test "-e foo"
33
+ p out.status
34
+
35
+ out = shell.ls "-laZ"
36
+ p out.stderr
37
+ p out.status
38
+
39
+ out = shell.cd "/really/bogus/directory"
40
+ p out.stderr
41
+ p out.status
42
+
43
+ out = shell.send_command "/sbin/ifconfig"
44
+ p out.stdout
45
+ p out.status
46
+
47
+ out = shell.pwd
48
+ p out.stdout
49
+
50
+ out = shell.ruby "-v"
51
+ p out.stdout
52
+
53
+ out = shell.cd "/usr/lib"
54
+
55
+ out = shell.pwd
56
+ p out.stdout
57
+
58
+ out = shell.send_command( "bc", <<CMD )
59
+ 5+5
60
+ 10*2
61
+ scale=5
62
+ 3/4
63
+ quit
64
+ CMD
65
+ p out.stdout
66
+
67
+ p shell.exit
68
+
69
+ end
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
data/lib/net/ssh.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
@@ -15,6 +15,7 @@
15
15
  #++
16
16
 
17
17
  require 'net/ssh/connection/constants'
18
+ require 'net/ssh/connection/term'
18
19
 
19
20
  module Net
20
21
  module SSH
@@ -256,23 +257,78 @@ module Net
256
257
 
257
258
  # Send a data packet to the server, over the channel.
258
259
  def send_data( data )
260
+ @connection.register_data_request( self, data )
261
+ end
262
+
263
+ # Send an extended data packet to the server, over the channel.
264
+ # Extended data always has a numeric type associated with it. The
265
+ # only predefined type is 1, whic corresponds to +stderr+ data.
266
+ def send_extended_data( type, data )
267
+ @connection.register_data_request( self, data, type )
268
+ end
269
+
270
+ # Splits the given data so that it will fit in a data packet, taking
271
+ # into consideration the current window size and maximum packet size.
272
+ # The +overhead+ parameter is the number of additional bytes added by
273
+ # the packet itself.
274
+ #
275
+ # This returns a tuple, <tt>[data,data_to_return]</tt>, where the first
276
+ # element is the data to include in the packet, and the second element
277
+ # is the data remaining that would not fit in the packet.
278
+ def split_data_for_packet( data, overhead )
279
+ data_to_return = nil
280
+
281
+ if data.length > window_size
282
+ data_to_return = data[window_size..-1]
283
+ data = data[0,window_size]
284
+ end
285
+
286
+ if data.length + overhead > maximum_packet_size
287
+ data_to_return = data[maximum_packet_size..-1] +
288
+ ( data_to_return || "" )
289
+ data = data[0,maximum_packet_size]
290
+ end
291
+
292
+ [ data, data_to_return ]
293
+ end
294
+ private :split_data_for_packet
295
+
296
+ # Send a data packet to the server, over the channel. Only sends as
297
+ # much of that data as the channel is currently capable of sending
298
+ # (based on window size and maximum packet size), and returns any
299
+ # data that could not be sent. Returns +nil+ if all the data that
300
+ # was requested to be sent, was sent.
301
+ def send_data_packet( data )
302
+ # overhead is ( byte.length + id.length + strlen.length ) = 9
303
+ data, data_to_return = split_data_for_packet( data.to_s, 9 )
304
+ @window_size -= data.length
305
+
259
306
  msg = @buffers.writer
260
307
  msg.write_byte CHANNEL_DATA
261
308
  msg.write_long @remote_id
262
- msg.write_string data.to_s
309
+ msg.write_string data
263
310
  @connection.send_message msg
311
+
312
+ data_to_return
264
313
  end
265
314
 
266
315
  # Send an extended data packet to the server, over the channel.
267
316
  # Extended data always has a numeric type associated with it. The
268
317
  # only predefined type is 1, whic corresponds to +stderr+ data.
269
- def send_extended_data( type, data )
318
+ def send_extended_data_packet( type, data )
319
+ # overhead is
320
+ # ( byte.length + id.length + type.length + strlen.length ) = 13
321
+ data, data_to_return = split_data_for_packet( data.to_s, 13 )
322
+ @window_size -= data.length
323
+
270
324
  msg = @buffers.writer
271
325
  msg.write_byte CHANNEL_EXTENDED_DATA
272
326
  msg.write_long @remote_id
273
327
  msg.write_long type
274
- msg.write_string data.to_s
328
+ msg.write_string data
275
329
  @connection.send_message msg
330
+
331
+ data_to_return
276
332
  end
277
333
 
278
334
  VALID_PTY_OPTIONS = { :term=>"xterm",
@@ -295,9 +351,7 @@ module Net
295
351
  "invalid option(s) to request_pty: #{invalid_opts.inspect}"
296
352
  end
297
353
 
298
- VALID_PTY_OPTIONS.keys.each do |opt|
299
- opts[ opt ] ||= VALID_PTY_OPTIONS[ opt ]
300
- end
354
+ opts = VALID_PTY_OPTIONS.merge( opts )
301
355
 
302
356
  msg = @buffers.writer
303
357
  msg.write_string opts[ :term ]
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # =============================================================================
3
- # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
3
+ # Copyright (c) 2004,2005 Jamis Buck (jamis_buck@byu.edu)
4
4
  # All rights reserved.
5
5
  #
6
6
  # This source file is distributed as part of the Net::SSH Secure Shell Client
@@ -29,6 +29,10 @@ module Net
29
29
  # #global_request method.
30
30
  Request = Struct.new( :type, :data, :callback )
31
31
 
32
+ # A structure for representing a data buffer that must be sent
33
+ # across a channel.
34
+ DataRequest = Struct.new( :channel, :data, :type )
35
+
32
36
  #--
33
37
  # ====================================================================
34
38
  # CONSTRUCTOR
@@ -51,6 +55,7 @@ module Net
51
55
  @channel_map = Hash.new
52
56
  @request_queue = Array.new
53
57
  @channel_open_handlers = Hash.new
58
+ @data_requests = Array.new
54
59
  end
55
60
 
56
61
  #--
@@ -100,6 +105,21 @@ module Net
100
105
  end
101
106
  end
102
107
 
108
+ # Register a data buffer (of an optional type) to be sent across the
109
+ # given channel at the next available opportunity.
110
+ #
111
+ # This is used internally by channels to hide the window size and
112
+ # maximum packet size from the client. Clients should not call this
113
+ # method directly.
114
+ def register_data_request( channel, data, type=nil )
115
+ @data_requests << DataRequest.new( channel, data, type )
116
+
117
+ # make sure the new data request has a chance to be sent to the
118
+ # server... Otherwise, it cannot be sent until the next time #process
119
+ # is invoked, which can be unexpected in synchronous situations.
120
+ process_data_requests
121
+ end
122
+
103
123
  #--
104
124
  # ====================================================================
105
125
  # CONNECTION PROCESSING
@@ -114,16 +134,23 @@ module Net
114
134
  process while block.call
115
135
  end
116
136
 
117
- # Wait for and dispatch a single event.
118
- def process
119
- type, response = @session.wait_for_message
137
+ # Wait for and dispatch a single event. If +nonblock+ is false (the
138
+ # default) this will block until a message has been received. Otherwise,
139
+ # it will return immediately.
140
+ def process( nonblock=false )
141
+ process_data_requests
120
142
 
121
- unless ( dispatcher = MESSAGES[ type ] )
122
- raise Net::SSH::Exception,
123
- "Unexpected response type '#{type}', (#{response.inspect})"
143
+ if !nonblock || reader_ready?
144
+ type, response = @session.wait_for_message
145
+
146
+ unless ( dispatcher = MESSAGES[ type ] )
147
+ raise Net::SSH::Exception,
148
+ "Unexpected response type '#{type}', (#{response.inspect})"
149
+ end
150
+
151
+ dispatcher[:method].bind( self ).call( response )
124
152
  end
125
153
 
126
- dispatcher[:method].bind( self ).call( response )
127
154
  self
128
155
  end
129
156
 
@@ -153,6 +180,11 @@ module Net
153
180
  self
154
181
  end
155
182
 
183
+ # Delegates the the #reader_ready method of the transport session.
184
+ def reader_ready?
185
+ @session.reader_ready?
186
+ end
187
+
156
188
  #--
157
189
  # ====================================================================
158
190
  # MESSAGE HANDLERS
@@ -316,6 +348,27 @@ module Net
316
348
  request.callback.call( success, response ) if request.callback
317
349
  end
318
350
 
351
+ # Process all pending data requests.
352
+ def process_data_requests
353
+ @data_requests.map! do |req|
354
+ while req && req.channel.window_size > 0
355
+ remaining = if req.type
356
+ req.channel.send_extended_data_packet( req.type, req.data )
357
+ else
358
+ req.channel.send_data_packet( req.data )
359
+ end
360
+ if remaining
361
+ req.data = remaining
362
+ else
363
+ req = nil
364
+ end
365
+ end
366
+
367
+ req
368
+ end
369
+ @data_requests.compact!
370
+ end
371
+
319
372
  #--
320
373
  # ====================================================================
321
374
  # MESSAGE DISPATCHER SETUP