Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
K
koko
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
koko
Commits
50e6613c
Commit
50e6613c
authored
Apr 27, 2019
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Update] 并没有修改什么
parent
f5ea3187
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
431 additions
and
36 deletions
+431
-36
Gopkg.lock
Gopkg.lock
+162
-0
Gopkg.toml
Gopkg.toml
+70
-0
hello.go
cmd/hello.go
+85
-0
connection.go
pkg/proxy/connection.go
+43
-28
proxy.go
pkg/proxy/proxy.go
+64
-3
sshconn.go
pkg/proxybak/sshconn.go
+1
-1
session.go
pkg/sshd/handler/session.go
+6
-4
No files found.
Gopkg.lock
0 → 100644
View file @
50e6613c
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
[[projects]]
branch = "master"
digest = "1:1a200e7e73293b75eb8e5c93d023b5472663432da0b663e1532624fcfede9ca8"
name = "github.com/anmitsu/go-shlex"
packages = ["."]
pruneopts = "UT"
revision = "648efa622239a2f6ff949fed78ee37b48d499ba4"
[[projects]]
digest = "1:c9aca0b305d2cf7925af6a5b1bdc24b99e5fd901271ba6e0cbb562f4112d01e3"
name = "github.com/ibuler/ssh"
packages = ["."]
pruneopts = "UT"
revision = "6e3e06f8bbc854467434a7c66e98566c506c0502"
version = "0.1.5"
[[projects]]
digest = "1:e77a03f1e4f1e4e035e46dc3cd79b1e33acbf651540aaa5e148caf1296884d18"
name = "github.com/jarcoal/httpmock"
packages = ["."]
pruneopts = "UT"
revision = "e598472b238f5d2a505e1316886da2171f86bfa4"
version = "v1.0.3"
[[projects]]
digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de"
name = "github.com/konsorten/go-windows-terminal-sequences"
packages = ["."]
pruneopts = "UT"
revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e"
version = "v1.0.2"
[[projects]]
digest = "1:9cedee824c21326bd26950bd9e1ffe9dc4e7ca03dc8634d0e6f954ee6a383172"
name = "github.com/kr/fs"
packages = ["."]
pruneopts = "UT"
revision = "1455def202f6e05b95cc7bfc7e8ae67ae5141eba"
version = "v0.1.0"
[[projects]]
digest = "1:47dc4f6ee8a7dda99b516b56cb7fcc4f53ca94756263bdcea55c918a60126062"
name = "github.com/kr/pty"
packages = ["."]
pruneopts = "UT"
revision = "521317be5ebc228a0f0ede099fa2a0b5ece22e49"
version = "v1.1.4"
[[projects]]
digest = "1:0356f3312c9bd1cbeda81505b7fd437501d8e778ab66998ef69f00d7f9b3a0d7"
name = "github.com/mattn/go-runewidth"
packages = ["."]
pruneopts = "UT"
revision = "3ee7d812e62a0804a7d0a324e0249ca2db3476d3"
version = "v0.0.4"
[[projects]]
digest = "1:abcdbf03ca6ca13d3697e2186edc1f33863bbdac2b3a44dfa39015e8903f7409"
name = "github.com/olekukonko/tablewriter"
packages = ["."]
pruneopts = "UT"
revision = "e6d60cf7ba1f42d86d54cdf5508611c4aafb3970"
version = "v0.0.1"
[[projects]]
digest = "1:cf31692c14422fa27c83a05292eb5cbe0fb2775972e8f1f8446a71549bd8980b"
name = "github.com/pkg/errors"
packages = ["."]
pruneopts = "UT"
revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4"
version = "v0.8.1"
[[projects]]
digest = "1:6c187bc42f50a341b0dd25da7f5bcf84b4bbffa7193b92f3c983c1a9803a447a"
name = "github.com/pkg/sftp"
packages = ["."]
pruneopts = "UT"
revision = "a713b07e6d90e1831d7fefcb69f1310edb3783ae"
version = "v1.10.0"
[[projects]]
digest = "1:274f67cb6fed9588ea2521ecdac05a6d62a8c51c074c1fccc6a49a40ba80e925"
name = "github.com/satori/go.uuid"
packages = ["."]
pruneopts = "UT"
revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3"
version = "v1.2.0"
[[projects]]
digest = "1:fd61cf4ae1953d55df708acb6b91492d538f49c305b364a014049914495db426"
name = "github.com/sirupsen/logrus"
packages = ["."]
pruneopts = "UT"
revision = "8bdbc7bcc01dcbb8ec23dc8a28e332258d25251f"
version = "v1.4.1"
[[projects]]
branch = "master"
digest = "1:fbbce3ff584585118f3c270df893dea88eb3e7ddbece46ea322410af9ae27829"
name = "github.com/xlab/treeprint"
packages = ["."]
pruneopts = "UT"
revision = "a009c3971eca89777614839eb7f69abed3ea3959"
[[projects]]
branch = "master"
digest = "1:7ba755bbcaaf821fd0c73c96069883c4467d6e261e3ecc81adddb8e0bfc67527"
name = "golang.org/x/crypto"
packages = [
"curve25519",
"ed25519",
"ed25519/internal/edwards25519",
"internal/chacha20",
"internal/subtle",
"poly1305",
"ssh",
"ssh/terminal",
]
pruneopts = "UT"
revision = "a29dc8fdc73485234dbef99ebedb95d2eced08de"
[[projects]]
branch = "master"
digest = "1:91f01f15f85f43f18cbed401dfc839879a12678f8254fcfe93daaddd4a3e52e0"
name = "golang.org/x/sys"
packages = [
"cpu",
"unix",
"windows",
]
pruneopts = "UT"
revision = "a129542de9ae0895210abff9c95d67a1f33cb93d"
[[projects]]
digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96"
name = "gopkg.in/yaml.v2"
packages = ["."]
pruneopts = "UT"
revision = "51d6538a90f86fe93ac480b35f37b2be17fef232"
version = "v2.2.2"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
input-imports = [
"github.com/ibuler/ssh",
"github.com/jarcoal/httpmock",
"github.com/kr/pty",
"github.com/olekukonko/tablewriter",
"github.com/pkg/sftp",
"github.com/satori/go.uuid",
"github.com/sirupsen/logrus",
"github.com/xlab/treeprint",
"golang.org/x/crypto/ssh",
"golang.org/x/crypto/ssh/terminal",
"gopkg.in/yaml.v2",
]
solver-name = "gps-cdcl"
solver-version = 1
Gopkg.toml
0 → 100644
View file @
50e6613c
# Gopkg.toml example
#
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
# name = "github.com/user/project"
# version = "1.0.0"
#
# [[constraint]]
# name = "github.com/user/project2"
# branch = "dev"
# source = "github.com/myfork/project2"
#
# [[override]]
# name = "github.com/x/y"
# version = "2.4.0"
#
# [prune]
# non-go = false
# go-tests = true
# unused-packages = true
[[constraint]]
name
=
"github.com/ibuler/ssh"
version
=
"0.1.5"
[[constraint]]
name
=
"github.com/jarcoal/httpmock"
version
=
"1.0.3"
[[constraint]]
name
=
"github.com/kr/pty"
version
=
"1.1.4"
[[constraint]]
name
=
"github.com/olekukonko/tablewriter"
version
=
"0.0.1"
[[constraint]]
name
=
"github.com/pkg/sftp"
version
=
"1.10.0"
[[constraint]]
name
=
"github.com/satori/go.uuid"
version
=
"1.2.0"
[[constraint]]
name
=
"github.com/sirupsen/logrus"
version
=
"1.4.1"
[[constraint]]
branch
=
"master"
name
=
"github.com/xlab/treeprint"
[[constraint]]
branch
=
"master"
name
=
"golang.org/x/crypto"
[[constraint]]
name
=
"gopkg.in/yaml.v2"
version
=
"2.2.2"
[prune]
go-tests
=
true
unused-packages
=
true
cmd/hello.go
0 → 100644
View file @
50e6613c
package
main
import
(
"fmt"
"golang.org/x/crypto/ssh/terminal"
"log"
"os"
"time"
"golang.org/x/crypto/ssh"
)
func
connect
(
user
,
password
,
host
string
,
port
int
)
(
*
ssh
.
Session
,
error
)
{
var
(
auth
[]
ssh
.
AuthMethod
addr
string
clientConfig
*
ssh
.
ClientConfig
client
*
ssh
.
Client
session
*
ssh
.
Session
err
error
)
// get auth method
auth
=
make
([]
ssh
.
AuthMethod
,
0
)
auth
=
append
(
auth
,
ssh
.
Password
(
password
))
clientConfig
=
&
ssh
.
ClientConfig
{
User
:
user
,
Auth
:
auth
,
Timeout
:
30
*
time
.
Second
,
HostKeyCallback
:
ssh
.
InsecureIgnoreHostKey
(),
}
// connet to ssh
addr
=
fmt
.
Sprintf
(
"%s:%d"
,
host
,
port
)
if
client
,
err
=
ssh
.
Dial
(
"tcp"
,
addr
,
clientConfig
);
err
!=
nil
{
return
nil
,
err
}
// create session
if
session
,
err
=
client
.
NewSession
();
err
!=
nil
{
return
nil
,
err
}
return
session
,
nil
}
func
main
()
{
session
,
err
:=
connect
(
"root"
,
"redhat"
,
"192.168.244.143"
,
22
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
defer
session
.
Close
()
fd
:=
int
(
os
.
Stdin
.
Fd
())
oldState
,
err
:=
terminal
.
MakeRaw
(
fd
)
if
err
!=
nil
{
panic
(
err
)
}
defer
terminal
.
Restore
(
fd
,
oldState
)
// excute command
session
.
Stdout
=
os
.
Stdout
session
.
Stderr
=
os
.
Stderr
session
.
Stdin
=
os
.
Stdin
termWidth
,
termHeight
,
err
:=
terminal
.
GetSize
(
fd
)
if
err
!=
nil
{
panic
(
err
)
}
// Set up terminal modes
modes
:=
ssh
.
TerminalModes
{
ssh
.
ECHO
:
1
,
// enable echoing
ssh
.
TTY_OP_ISPEED
:
14400
,
// input speed = 14.4kbaud
ssh
.
TTY_OP_OSPEED
:
14400
,
// output speed = 14.4kbaud
}
// Request pseudo terminal
if
err
:=
session
.
RequestPty
(
"xterm-256color"
,
termHeight
,
termWidth
,
modes
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
session
.
Run
(
"top"
)
}
pkg/proxy/connection.go
View file @
50e6613c
...
...
@@ -2,6 +2,7 @@ package proxy
import
(
"fmt"
"io"
"net"
"time"
...
...
@@ -9,8 +10,8 @@ import (
)
type
ServerConnection
interface
{
SendChannel
()
chan
<-
[]
byte
Re
cvChannel
()
<-
chan
[]
byte
Writer
()
io
.
WriteCloser
Re
ader
()
io
.
Reader
Protocol
()
string
Connect
()
error
Close
()
...
...
@@ -27,81 +28,95 @@ type SSHConnection struct {
Proxy
*
SSHConnection
client
*
gossh
.
Client
Session
*
gossh
.
Session
proxyConn
gossh
.
Conn
}
func
(
s
*
SSHConnection
)
Protocol
()
string
{
func
(
s
c
*
SSHConnection
)
Protocol
()
string
{
return
"ssh"
}
func
(
s
*
SSHConnection
)
Config
()
(
config
*
gossh
.
ClientConfig
,
err
error
)
{
func
(
s
c
*
SSHConnection
)
Config
()
(
config
*
gossh
.
ClientConfig
,
err
error
)
{
auths
:=
make
([]
gossh
.
AuthMethod
,
0
)
if
s
.
Password
!=
""
{
auths
=
append
(
auths
,
gossh
.
Password
(
s
.
Password
))
if
s
c
.
Password
!=
""
{
auths
=
append
(
auths
,
gossh
.
Password
(
s
c
.
Password
))
}
if
s
.
PrivateKeyPath
!=
""
{
if
pubkey
,
err
:=
GetPubKeyFromFile
(
s
.
PrivateKeyPath
);
err
!=
nil
{
err
=
fmt
.
Errorf
(
"parse private key from file error: %s"
,
err
)
if
s
c
.
PrivateKeyPath
!=
""
{
if
pubkey
,
err
:=
GetPubKeyFromFile
(
s
c
.
PrivateKeyPath
);
err
!=
nil
{
err
=
fmt
.
Errorf
(
"parse private key from file error: %s
c
"
,
err
)
return
config
,
err
}
else
{
auths
=
append
(
auths
,
gossh
.
PublicKeys
(
pubkey
))
}
}
if
s
.
PrivateKey
!=
""
{
if
signer
,
err
:=
gossh
.
ParsePrivateKey
([]
byte
(
s
.
PrivateKey
));
err
!=
nil
{
err
=
fmt
.
Errorf
(
"parse private key error: %s"
,
err
)
if
s
c
.
PrivateKey
!=
""
{
if
signer
,
err
:=
gossh
.
ParsePrivateKey
([]
byte
(
s
c
.
PrivateKey
));
err
!=
nil
{
err
=
fmt
.
Errorf
(
"parse private key error: %s
c
"
,
err
)
return
config
,
err
}
else
{
auths
=
append
(
auths
,
gossh
.
PublicKeys
(
signer
))
}
}
config
=
&
gossh
.
ClientConfig
{
User
:
s
.
User
,
User
:
s
c
.
User
,
Auth
:
auths
,
HostKeyCallback
:
gossh
.
InsecureIgnoreHostKey
(),
Timeout
:
s
.
Timeout
,
Timeout
:
s
c
.
Timeout
,
}
return
config
,
nil
}
func
(
s
*
SSHConnection
)
Connect
()
(
client
*
gossh
.
Client
,
err
error
)
{
config
,
err
:=
s
.
Config
()
func
(
s
c
*
SSHConnection
)
Connect
()
(
client
*
gossh
.
Client
,
err
error
)
{
config
,
err
:=
s
c
.
Config
()
if
err
!=
nil
{
return
}
if
s
.
Proxy
!=
nil
{
proxyClient
,
err
:=
s
.
Proxy
.
Connect
()
if
s
c
.
Proxy
!=
nil
{
proxyClient
,
err
:=
s
c
.
Proxy
.
Connect
()
if
err
!=
nil
{
return
client
,
err
}
proxySock
,
err
:=
proxyClient
.
Dial
(
"tcp"
,
net
.
JoinHostPort
(
s
.
Host
,
s
.
Port
))
proxySock
,
err
:=
proxyClient
.
Dial
(
"tcp"
,
net
.
JoinHostPort
(
s
c
.
Host
,
sc
.
Port
))
if
err
!=
nil
{
return
client
,
err
}
proxyConn
,
chans
,
reqs
,
err
:=
gossh
.
NewClientConn
(
proxySock
,
net
.
JoinHostPort
(
s
.
Host
,
s
.
Port
),
config
)
proxyConn
,
chans
,
reqs
,
err
:=
gossh
.
NewClientConn
(
proxySock
,
net
.
JoinHostPort
(
s
c
.
Host
,
sc
.
Port
),
config
)
if
err
!=
nil
{
return
client
,
err
}
s
.
proxyConn
=
proxyConn
s
c
.
proxyConn
=
proxyConn
client
=
gossh
.
NewClient
(
proxyConn
,
chans
,
reqs
)
}
else
{
client
,
err
=
gossh
.
Dial
(
"tcp"
,
net
.
JoinHostPort
(
s
.
Host
,
s
.
Port
),
config
)
client
,
err
=
gossh
.
Dial
(
"tcp"
,
net
.
JoinHostPort
(
s
c
.
Host
,
sc
.
Port
),
config
)
if
err
!=
nil
{
err
=
fmt
.
Errorf
(
"connect host %s
error: %s"
,
s
.
Host
,
err
)
err
=
fmt
.
Errorf
(
"connect host %s
c error: %sc"
,
sc
.
Host
,
err
)
return
}
}
s
.
client
=
client
sc
.
client
=
client
sess
,
err
:=
sc
.
client
.
NewSession
()
if
err
!=
nil
{
return
}
sc
.
Session
=
sess
return
client
,
nil
}
func
(
s
*
SSHConnection
)
Close
()
error
{
err
:=
s
.
client
.
Close
()
func
(
sc
*
SSHConnection
)
Reader
()
(
reader
io
.
Reader
,
err
error
)
{
return
sc
.
Session
.
StdoutPipe
()
}
func
(
sc
*
SSHConnection
)
Writer
()
(
writer
io
.
WriteCloser
,
err
error
)
{
return
sc
.
Session
.
StdinPipe
()
}
func
(
sc
*
SSHConnection
)
Close
()
error
{
err
:=
sc
.
client
.
Close
()
if
err
!=
nil
{
return
err
}
if
s
.
proxyConn
!=
nil
{
err
=
s
.
proxyConn
.
Close
()
if
s
c
.
proxyConn
!=
nil
{
err
=
s
c
.
proxyConn
.
Close
()
}
return
err
}
pkg/proxy/proxy.go
View file @
50e6613c
package
proxy
import
(
"cocogo/pkg/logger"
"cocogo/pkg/service"
"fmt"
"time"
"github.com/ibuler/ssh"
gossh
"golang.org/x/crypto/ssh"
"cocogo/pkg/logger"
"cocogo/pkg/sdk"
"cocogo/pkg/service"
)
type
ProxyServer
struct
{
sess
ssh
.
Session
Session
ssh
.
Session
User
*
sdk
.
User
Asset
*
sdk
.
Asset
SystemUser
*
sdk
.
SystemUser
...
...
@@ -49,5 +53,62 @@ func (p *ProxyServer) Proxy() {
if
!
p
.
checkProtocol
()
{
return
}
conn
:=
SSHConnection
{
Host
:
"192.168.244.143"
,
Port
:
"22"
,
User
:
"root"
,
Password
:
"redhat"
,
}
_
,
err
:=
conn
.
Connect
()
if
err
!=
nil
{
return
}
ptyReq
,
_
,
ok
:=
p
.
Session
.
Pty
()
if
!
ok
{
logger
.
Error
(
"Pty not ok"
)
return
}
fmt
.
Println
(
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
)
modes
:=
gossh
.
TerminalModes
{
gossh
.
ECHO
:
1
,
// enable echoing
gossh
.
TTY_OP_ISPEED
:
14400
,
// input speed = 14.4kbaud
gossh
.
TTY_OP_OSPEED
:
14400
,
// output speed = 14.4kbaud
}
err
=
conn
.
Session
.
RequestPty
(
"xterm"
,
ptyReq
.
Window
.
Height
,
ptyReq
.
Window
.
Width
,
modes
)
if
err
!=
nil
{
logger
.
Errorf
(
"Request pty error: %s"
,
err
)
return
}
go
func
()
{
buf
:=
make
([]
byte
,
1024
)
writer
,
err
:=
conn
.
Session
.
StdinPipe
()
if
err
!=
nil
{
return
}
for
{
nr
,
err
:=
p
.
Session
.
Read
(
buf
)
if
err
!=
nil
{
writer
.
Write
(
buf
[
:
nr
])
}
}
}()
go
func
()
{
buf
:=
make
([]
byte
,
1024
)
reader
,
err
:=
conn
.
Reader
()
if
err
!=
nil
{
return
}
for
{
nr
,
err
:=
reader
.
Read
(
buf
)
if
err
!=
nil
{
logger
.
Error
(
"Read error"
)
}
p
.
Session
.
Write
(
buf
[
:
nr
])
}
}()
time
.
Sleep
(
time
.
Second
*
20
)
}
pkg/proxybak/sshconn.go
View file @
50e6613c
...
...
@@ -83,7 +83,7 @@ func NewNodeConn(ctx context.Context, authInfo ServerAuth, ptyReq ssh.Pty, winCh
replyRecord
:=
record
.
NewReplyRecord
(
authInfo
.
SessionID
)
replyRecord
.
StartRecord
()
go
replyRecord
.
EndRecord
(
subCtx
)
//
go replyRecord.EndRecord(subCtx)
nConn
:=
&
NodeConn
{
SessionID
:
authInfo
.
SessionID
,
client
:
c
,
...
...
pkg/sshd/handler/session.go
View file @
50e6613c
package
handler
import
(
"cocogo/pkg/proxy"
//"cocogo/pkg/proxybak"
//"cocogo/pkg/proxybak"
"context"
...
...
@@ -96,7 +97,7 @@ func (i *InteractiveHandler) watchWinSizeChange(winCh <-chan ssh.Window) {
}
}
func
(
i
*
InteractiveHandler
)
Dispatch
(
ctx
c
ctx
.
Context
)
{
func
(
i
*
InteractiveHandler
)
Dispatch
(
ctx
c
ontext
.
Context
)
{
i
.
preDispatch
()
_
,
winCh
,
_
:=
i
.
sess
.
Pty
()
for
{
...
...
@@ -112,7 +113,7 @@ func (i *InteractiveHandler) Dispatch(ctx cctx.Context) {
case
0
,
1
:
switch
strings
.
ToLower
(
line
)
{
case
""
,
"p"
:
i
.
displayAssets
(
i
.
assets
)
i
.
Proxy
(
ctx
)
case
"g"
:
i
.
displayNodes
(
i
.
nodes
)
case
"s"
:
...
...
@@ -326,8 +327,9 @@ func (i *InteractiveHandler) searchNodeAssets(num int) (assets []sdk.Asset) {
}
func
(
i
*
InteractiveHandler
)
Proxy
(
asset
sdk
.
Asset
,
systemUser
sdk
.
SystemUserAuthInfo
)
error
{
return
nil
func
(
i
*
InteractiveHandler
)
Proxy
(
ctx
context
.
Context
)
{
p
:=
proxy
.
ProxyServer
{
Session
:
i
.
sess
}
p
.
Proxy
()
}
// /*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment