net-ssh 2.1.4 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +4 -0
- data/Rakefile +1 -1
- data/lib/net/ssh.rb +7 -4
- data/lib/net/ssh/config.rb +2 -0
- data/lib/net/ssh/service/forward.rb +18 -8
- data/lib/net/ssh/transport/session.rb +2 -1
- data/lib/net/ssh/version.rb +2 -2
- data/net-ssh.gemspec +1 -1
- data/test/manual/test_forward.rb +39 -1
- data/test/test_config.rb +3 -1
- metadata +2 -2
data/CHANGELOG.rdoc
CHANGED
data/Rakefile
CHANGED
data/lib/net/ssh.rb
CHANGED
@@ -61,10 +61,10 @@ module Net
|
|
61
61
|
# This is the set of options that Net::SSH.start recognizes. See
|
62
62
|
# Net::SSH.start for a description of each option.
|
63
63
|
VALID_OPTIONS = [
|
64
|
-
:auth_methods, :compression, :compression_level, :config,
|
65
|
-
:forward_agent, :hmac, :host_key, :kex, :keys, :key_data,
|
66
|
-
:logger, :paranoid, :password, :port, :proxy,
|
67
|
-
:rekey_limit, :rekey_packet_limit, :timeout, :verbose,
|
64
|
+
:auth_methods, :bind_address, :compression, :compression_level, :config,
|
65
|
+
:encryption, :forward_agent, :hmac, :host_key, :kex, :keys, :key_data,
|
66
|
+
:languages, :logger, :paranoid, :password, :port, :proxy,
|
67
|
+
:rekey_blocks_limit,:rekey_limit, :rekey_packet_limit, :timeout, :verbose,
|
68
68
|
:global_known_hosts_file, :user_known_hosts_file, :host_key_alias,
|
69
69
|
:host_name, :user, :properties, :passphrase, :keys_only
|
70
70
|
]
|
@@ -98,6 +98,9 @@ module Net
|
|
98
98
|
# This method accepts the following options (all are optional):
|
99
99
|
#
|
100
100
|
# * :auth_methods => an array of authentication methods to try
|
101
|
+
# * :bind_address => the IP address on the connecting machine to use in
|
102
|
+
# establishing connection. (:bind_address is discarded if :proxy
|
103
|
+
# is set.)
|
101
104
|
# * :compression => the compression algorithm to use, or +true+ to use
|
102
105
|
# whatever is supported.
|
103
106
|
# * :compression_level => the compression level to use when sending data
|
data/lib/net/ssh/config.rb
CHANGED
@@ -119,6 +119,8 @@ module Net; module SSH
|
|
119
119
|
def translate(settings)
|
120
120
|
settings.inject({}) do |hash, (key, value)|
|
121
121
|
case key
|
122
|
+
when 'bindaddress' then
|
123
|
+
hash[:bind_address] = value
|
122
124
|
when 'ciphers' then
|
123
125
|
hash[:encryption] = value.split(/,/)
|
124
126
|
when 'compression' then
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
require 'net/ssh/loggable'
|
2
3
|
|
3
4
|
module Net; module SSH; module Service
|
@@ -53,22 +54,31 @@ module Net; module SSH; module Service
|
|
53
54
|
raise ArgumentError, "expected 3 or 4 parameters, got #{args.length}"
|
54
55
|
end
|
55
56
|
|
56
|
-
|
57
|
-
|
57
|
+
local_port_type = :long
|
58
|
+
|
59
|
+
socket = begin
|
60
|
+
if args.first.class == UNIXServer
|
61
|
+
local_port_type = :string
|
62
|
+
args.shift
|
63
|
+
else
|
64
|
+
bind_address = "127.0.0.1"
|
65
|
+
bind_address = args.shift if args.first.is_a?(String) && args.first =~ /\D/
|
66
|
+
local_port = args.shift.to_i
|
67
|
+
local_port_type = :long
|
68
|
+
TCPServer.new(bind_address, local_port)
|
69
|
+
end
|
70
|
+
end
|
58
71
|
|
59
|
-
local_port = args.shift.to_i
|
60
72
|
remote_host = args.shift
|
61
73
|
remote_port = args.shift.to_i
|
62
74
|
|
63
|
-
socket = TCPServer.new(bind_address, local_port)
|
64
|
-
|
65
75
|
@local_forwarded_ports[[local_port, bind_address]] = socket
|
66
76
|
|
67
77
|
session.listen_to(socket) do |server|
|
68
78
|
client = server.accept
|
69
|
-
debug { "received connection on #{
|
79
|
+
debug { "received connection on #{socket}" }
|
70
80
|
|
71
|
-
channel = session.open_channel("direct-tcpip", :string, remote_host, :long, remote_port, :string, bind_address,
|
81
|
+
channel = session.open_channel("direct-tcpip", :string, remote_host, :long, remote_port, :string, bind_address, local_port_type, local_port) do |achannel|
|
72
82
|
achannel.info { "direct channel established" }
|
73
83
|
end
|
74
84
|
|
@@ -285,4 +295,4 @@ module Net; module SSH; module Service
|
|
285
295
|
end
|
286
296
|
end
|
287
297
|
|
288
|
-
end; end; end
|
298
|
+
end; end; end
|
@@ -58,11 +58,12 @@ module Net; module SSH; module Transport
|
|
58
58
|
|
59
59
|
@host = host
|
60
60
|
@port = options[:port] || DEFAULT_PORT
|
61
|
+
@bind_address = options[:bind_address] || nil
|
61
62
|
@options = options
|
62
63
|
|
63
64
|
debug { "establishing connection to #{@host}:#{@port}" }
|
64
65
|
factory = options[:proxy] || TCPSocket
|
65
|
-
@socket = timeout(options[:timeout] || 0) { factory.open(@host, @port) }
|
66
|
+
@socket = timeout(options[:timeout] || 0) { @bind_address.nil? || options[:proxy] ? factory.open(@host, @port) : factory.open(@host,@port,@bind_address) }
|
66
67
|
@socket.extend(PacketStream)
|
67
68
|
@socket.logger = @logger
|
68
69
|
|
data/lib/net/ssh/version.rb
CHANGED
@@ -48,10 +48,10 @@ module Net; module SSH
|
|
48
48
|
MAJOR = 2
|
49
49
|
|
50
50
|
# The minor component of this version of the Net::SSH library
|
51
|
-
MINOR =
|
51
|
+
MINOR = 2
|
52
52
|
|
53
53
|
# The tiny component of this version of the Net::SSH library
|
54
|
-
TINY =
|
54
|
+
TINY = 0
|
55
55
|
|
56
56
|
# The current version of the Net::SSH library as a Version instance
|
57
57
|
CURRENT = new(MAJOR, MINOR, TINY)
|
data/net-ssh.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "net-ssh"
|
3
3
|
s.rubyforge_project = 'net-ssh'
|
4
|
-
s.version = "2.
|
4
|
+
s.version = "2.2.0"
|
5
5
|
s.summary = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
|
6
6
|
s.description = s.summary
|
7
7
|
s.authors = ["Jamis Buck", "Delano Mandelbaum"]
|
data/test/manual/test_forward.rb
CHANGED
@@ -18,6 +18,7 @@ require 'common'
|
|
18
18
|
require 'net/ssh/buffer'
|
19
19
|
require 'net/ssh'
|
20
20
|
require 'timeout'
|
21
|
+
require 'tempfile'
|
21
22
|
|
22
23
|
class TestForward < Test::Unit::TestCase
|
23
24
|
|
@@ -120,7 +121,44 @@ class TestForward < Test::Unit::TestCase
|
|
120
121
|
session.loop(0.1) { client_done.empty? }
|
121
122
|
assert_equal "Broken pipe", "#{server_exc.pop}" unless server_exc.empty?
|
122
123
|
end
|
124
|
+
|
125
|
+
def create_local_socket(&blk)
|
126
|
+
tempfile = Tempfile.new("net_ssh_forward_test")
|
127
|
+
path = tempfile.path
|
128
|
+
tempfile.delete
|
129
|
+
yield UNIXServer.open(path)
|
130
|
+
File.delete(path)
|
131
|
+
end
|
123
132
|
|
133
|
+
def test_forward_local_unix_socket_to_remote_port
|
134
|
+
session = Net::SSH.start(*ssh_start_params)
|
135
|
+
server_exc = Queue.new
|
136
|
+
server = start_server_sending_lot_of_data(server_exc)
|
137
|
+
remote_port = server.addr[1]
|
138
|
+
client_data = nil
|
139
|
+
|
140
|
+
create_local_socket do |local_socket|
|
141
|
+
session.forward.local(local_socket, localhost, remote_port)
|
142
|
+
client_done = Queue.new
|
143
|
+
|
144
|
+
Thread.start do
|
145
|
+
begin
|
146
|
+
client = UNIXSocket.new(local_socket.path)
|
147
|
+
client_data = client.recv(1024)
|
148
|
+
client.close
|
149
|
+
sleep(0.2)
|
150
|
+
ensure
|
151
|
+
client_done << true
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
session.loop(0.1) { client_done.empty? }
|
156
|
+
end
|
157
|
+
|
158
|
+
assert_not_nil(client_data, "client should have received data")
|
159
|
+
assert(client_data.match(/item\d/), 'client should have received the string item')
|
160
|
+
end
|
161
|
+
|
124
162
|
def test_loop_should_not_abort_when_server_side_of_forward_is_closed
|
125
163
|
session = Net::SSH.start(*ssh_start_params)
|
126
164
|
server = start_server_closing_soon
|
@@ -182,4 +220,4 @@ class TestForward < Test::Unit::TestCase
|
|
182
220
|
assert_equal "This is a small message!", client_done.pop
|
183
221
|
end
|
184
222
|
end
|
185
|
-
end
|
223
|
+
end
|
data/test/test_config.rb
CHANGED
@@ -67,6 +67,7 @@ class TestConfig < Test::Unit::TestCase
|
|
67
67
|
|
68
68
|
def test_translate_should_correctly_translate_from_openssh_to_net_ssh_names
|
69
69
|
open_ssh = {
|
70
|
+
'bindaddress' => "127.0.0.1",
|
70
71
|
'ciphers' => "a,b,c",
|
71
72
|
'compression' => true,
|
72
73
|
'compressionlevel' => 6,
|
@@ -95,6 +96,7 @@ class TestConfig < Test::Unit::TestCase
|
|
95
96
|
assert_equal %w(j k l), net_ssh[:hmac]
|
96
97
|
assert_equal 1234, net_ssh[:port]
|
97
98
|
assert_equal 1024, net_ssh[:rekey_limit]
|
99
|
+
assert_equal "127.0.0.1", net_ssh[:bind_address]
|
98
100
|
end
|
99
101
|
|
100
102
|
def test_load_with_plus_sign_hosts
|
@@ -114,4 +116,4 @@ class TestConfig < Test::Unit::TestCase
|
|
114
116
|
def config(name)
|
115
117
|
"test/configs/#{name}"
|
116
118
|
end
|
117
|
-
end
|
119
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: net-ssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 2.
|
5
|
+
version: 2.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jamis Buck
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2011-
|
14
|
+
date: 2011-08-17 00:00:00 -04:00
|
15
15
|
default_executable:
|
16
16
|
dependencies: []
|
17
17
|
|