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