em-wssh 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/README.md +113 -9
- data/lib/em/wssh.rb +1 -1
- data/lib/em/wssh/connect.rb +1 -1
- data/lib/em/wssh/service.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1db6dba2f0f3dff81eed7b595806938e0bd8f064
|
4
|
+
data.tar.gz: 473cd9aaa813c0f21a5f178e03a90cf52acde42c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c01b25a7cf340ddb7f9ad0aadc5feaee60afc1f6acbb1660122eb3724011d8e2062abf02db60144052b23be6113584cd848cd02338806108894058820d78542b
|
7
|
+
data.tar.gz: 52d414591dfaf37c7c65c3a4610974f0ad491bb8c9d7b1d0bdfbfec3da832328b2189230638f0f72676476f5e4b2262c03908a2e4456806c19cfb359494fd20f
|
data/README.md
CHANGED
@@ -11,24 +11,128 @@ Ruby version of ssh thru websocket proxying.
|
|
11
11
|
Add this line to your application's Gemfile:
|
12
12
|
|
13
13
|
```ruby
|
14
|
-
|
14
|
+
gem 'em-wssh' if Gem.win_platform?
|
15
15
|
```
|
16
16
|
|
17
17
|
And then execute:
|
18
18
|
|
19
19
|
```sh
|
20
|
-
|
20
|
+
$ bundle
|
21
21
|
```
|
22
22
|
|
23
23
|
Or install it yourself as:
|
24
24
|
|
25
25
|
```sh
|
26
|
-
|
26
|
+
$ gem install em-wssh
|
27
27
|
```
|
28
28
|
|
29
29
|
## Usage
|
30
30
|
|
31
|
-
|
31
|
+
Single command `wssh` is exported. Sometimes it should be `bundle exec wssh`.
|
32
|
+
|
33
|
+
### WSSH Server
|
34
|
+
|
35
|
+
To run WSSH server say `wssh server`.
|
36
|
+
|
37
|
+
### nginx
|
38
|
+
|
39
|
+
Directly exposing WSSH server to Internet is not a good idea.
|
40
|
+
One should better install nginx (with TLS) and [force it to redirect](nginx/ssh)
|
41
|
+
WSSH connections to WSSH server.
|
42
|
+
|
43
|
+
### WSSH Client
|
44
|
+
|
45
|
+
Client is started with `wssh client URI`, eg `wssh client ws://localhost:4567`.
|
46
|
+
|
47
|
+
Running client from terminal is not very useful. It should be called by ssh client:
|
48
|
+
|
49
|
+
```sh
|
50
|
+
ssh -o ProxyCommand='wssh client wss://server.host.com/ssh/%h' sshd.local
|
51
|
+
```
|
52
|
+
|
53
|
+
By default WSSH server has 60 seconds timeout. To prevent idle connection to drop,
|
54
|
+
one can use `ServerAliveInterval` parameter:
|
55
|
+
|
56
|
+
```sh
|
57
|
+
ssh -o ProxyCommand='wssh client wss://server.host.com/ssh/%h' -o ServerAliveInterval=50 sshd.local
|
58
|
+
```
|
59
|
+
|
60
|
+
### WSSH Proxy
|
61
|
+
|
62
|
+
WSSH client is in fact unusable on Windows.
|
63
|
+
It can be impractical when we create a lot of SSH connections (eg with Capistrano mass deploy).
|
64
|
+
|
65
|
+
In these cases run `wssh connect URI`, it will listen to TCP port (3122 by default) and will work
|
66
|
+
as normal HTTP proxy, so proxy-capable clients (PuTTY/Plink and Net::SSH) can use it to connect to SSH servers.
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
#!/usr/bin/env ruby
|
70
|
+
|
71
|
+
require 'net/ssh'
|
72
|
+
require 'net/ssh/proxy/http'
|
73
|
+
|
74
|
+
x=Net::SSH.start 'sshd.local', 'root',
|
75
|
+
proxy: Net::SSH::Proxy::HTTP.new('localhost', 3122)
|
76
|
+
|
77
|
+
puts x.exec! 'hostname'
|
78
|
+
```
|
79
|
+
|
80
|
+
## API
|
81
|
+
|
82
|
+
WSSH server, client or proxy can be start programmaticaly:
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
require 'em/wssh/server'
|
86
|
+
|
87
|
+
s=EventMachine::Wssh::Server
|
88
|
+
s.options.merge! base: '.'
|
89
|
+
s.loop!
|
90
|
+
```
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
require 'em/wssh/client'
|
94
|
+
|
95
|
+
s=EventMachine::Wssh::Client
|
96
|
+
s.options[:uri]='wss://server.host.com/ssh/sshd.local'
|
97
|
+
s.loop!
|
98
|
+
```
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
require 'em/wssh/connect'
|
102
|
+
|
103
|
+
s=EventMachine::Wssh::Connect
|
104
|
+
s.options.merge! base: '.', all: true, uri: 'wss://server.host.com/ssh/sshd.local'
|
105
|
+
s.loop!
|
106
|
+
```
|
107
|
+
|
108
|
+
Some options are not accesible to `wssh` command and can be used only programmaticaly.
|
109
|
+
|
110
|
+
Eg, EventMachine::Wssh::Connect has option `onlisten` that allows listening to random port:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
#!/usr/bin/env ruby
|
114
|
+
|
115
|
+
require 'net/ssh'
|
116
|
+
require 'net/ssh/proxy/http'
|
117
|
+
require 'em/wssh/connect'
|
118
|
+
|
119
|
+
q=Queue.new
|
120
|
+
c=EventMachine::Wssh::Connect
|
121
|
+
c.options.merge!(
|
122
|
+
port: 0,
|
123
|
+
uri: 'wss://server.host.com/ssh',
|
124
|
+
onlisten: Proc.new{|port| q.push port},
|
125
|
+
)
|
126
|
+
|
127
|
+
Thread.new{c.loop!}
|
128
|
+
|
129
|
+
puts "Port=#{port=q.pop}"
|
130
|
+
|
131
|
+
x=Net::SSH.start 'sshd.local', 'root',
|
132
|
+
proxy: Net::SSH::Proxy::HTTP.new('localhost', port)
|
133
|
+
|
134
|
+
puts x.exec! 'hostname'
|
135
|
+
```
|
32
136
|
|
33
137
|
## Data flow
|
34
138
|
|
@@ -40,8 +144,8 @@ Normal SSH session is very simple:
|
|
40
144
|
|
41
145
|
WSSH session is:
|
42
146
|
|
43
|
-
* SSH Client with -o ProxyCommand='
|
44
|
-
* client
|
147
|
+
* SSH Client with -o ProxyCommand='wssh client WSSH-URI'
|
148
|
+
* WSSH client listening to its stdin
|
45
149
|
* Websocket (HTTP/HTTPS) connection to nginx
|
46
150
|
* nginx [configured](nginx/ssh) to redirect connection to WSSH server
|
47
151
|
* Another Websocket connection from nginx to WSSH server
|
@@ -53,9 +157,9 @@ And nginx stage can be omited in development/testing scenarios.
|
|
53
157
|
|
54
158
|
In some scenarios this path can be even longer:
|
55
159
|
|
56
|
-
* SSH Client, capable to connect via HTTP proxy (eg PuTTY/PLink)
|
160
|
+
* SSH Client, capable to connect via HTTP proxy (eg PuTTY/PLink or Net::SSH)
|
57
161
|
* TCP connection to local proxy
|
58
|
-
* connect
|
162
|
+
* `wssh connect` listening to dedicated port (3122 by default)
|
59
163
|
* Websocket (HTTP/HTTPS) connection to nginx
|
60
164
|
* nginx [configured](nginx/ssh) to redirect connection to WSSH server
|
61
165
|
* Another Websocket connection from nginx to WSSH server
|
@@ -74,7 +178,7 @@ Windows installation of EventMachine has a few bugs:
|
|
74
178
|
So, this package is in fact almost unusable on MS Windows.
|
75
179
|
|
76
180
|
The only exception: if you connect to Non-TLS WSSH server
|
77
|
-
(ws: or http:, not wss: or https:), you **can** start connect
|
181
|
+
(ws: or http:, not wss: or https:), you **can** start `wssh connect`
|
78
182
|
and then use SSH client, capable to connect via HTTP proxy.
|
79
183
|
|
80
184
|
To connect to TLS WSSH server, you should use Node.js version.
|
data/lib/em/wssh.rb
CHANGED
data/lib/em/wssh/connect.rb
CHANGED
@@ -161,7 +161,7 @@ Usage: #{Exe.biname} [options...] ws[s]://host[:port]/uri
|
|
161
161
|
|
162
162
|
def self.listen!
|
163
163
|
conn=EM.start_server options[:host], options[:port], Http
|
164
|
-
options[:
|
164
|
+
options[:onlisten].call Socket.unpack_sockaddr_in(EM.get_sockname conn)[0] if options[:onlisten]
|
165
165
|
end
|
166
166
|
end
|
167
167
|
end
|
data/lib/em/wssh/service.rb
CHANGED
@@ -6,7 +6,7 @@ module Service
|
|
6
6
|
|
7
7
|
def log *msg
|
8
8
|
msg.unshift "[#{Time.now}]"
|
9
|
-
|
9
|
+
puts msg*' '
|
10
10
|
end
|
11
11
|
|
12
12
|
def helptions
|
@@ -78,7 +78,6 @@ EOF
|
|
78
78
|
log "Going on in background..."
|
79
79
|
|
80
80
|
f = File.open mkdir(:log), 'a'
|
81
|
-
f.sync=true
|
82
81
|
|
83
82
|
STDIN.reopen '/dev/null'
|
84
83
|
STDOUT.reopen f
|
@@ -101,6 +100,7 @@ EOF
|
|
101
100
|
|
102
101
|
def loop!
|
103
102
|
self::Need.each{|f| require f}
|
103
|
+
STDOUT.sync=true
|
104
104
|
EM.run{ listen! }
|
105
105
|
end
|
106
106
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-wssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stas Ukolov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-websocket
|