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,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
|