Commit 50e6613c authored by ibuler's avatar ibuler

[Update] 并没有修改什么

parent f5ea3187
# 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 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
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")
}
......@@ -2,6 +2,7 @@ package proxy
import (
"fmt"
"io"
"net"
"time"
......@@ -9,8 +10,8 @@ import (
)
type ServerConnection interface {
SendChannel() chan<- []byte
RecvChannel() <-chan []byte
Writer() io.WriteCloser
Reader() 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 (sc *SSHConnection) Protocol() string {
return "ssh"
}
func (s *SSHConnection) Config() (config *gossh.ClientConfig, err error) {
func (sc *SSHConnection) Config() (config *gossh.ClientConfig, err error) {
auths := make([]gossh.AuthMethod, 0)
if s.Password != "" {
auths = append(auths, gossh.Password(s.Password))
if sc.Password != "" {
auths = append(auths, gossh.Password(sc.Password))
}
if s.PrivateKeyPath != "" {
if pubkey, err := GetPubKeyFromFile(s.PrivateKeyPath); err != nil {
err = fmt.Errorf("parse private key from file error: %s", err)
if sc.PrivateKeyPath != "" {
if pubkey, err := GetPubKeyFromFile(sc.PrivateKeyPath); err != nil {
err = fmt.Errorf("parse private key from file error: %sc", 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 sc.PrivateKey != "" {
if signer, err := gossh.ParsePrivateKey([]byte(sc.PrivateKey)); err != nil {
err = fmt.Errorf("parse private key error: %sc", err)
return config, err
} else {
auths = append(auths, gossh.PublicKeys(signer))
}
}
config = &gossh.ClientConfig{
User: s.User,
User: sc.User,
Auth: auths,
HostKeyCallback: gossh.InsecureIgnoreHostKey(),
Timeout: s.Timeout,
Timeout: sc.Timeout,
}
return config, nil
}
func (s *SSHConnection) Connect() (client *gossh.Client, err error) {
config, err := s.Config()
func (sc *SSHConnection) Connect() (client *gossh.Client, err error) {
config, err := sc.Config()
if err != nil {
return
}
if s.Proxy != nil {
proxyClient, err := s.Proxy.Connect()
if sc.Proxy != nil {
proxyClient, err := sc.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(sc.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(sc.Host, sc.Port), config)
if err != nil {
return client, err
}
s.proxyConn = proxyConn
sc.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(sc.Host, sc.Port), config)
if err != nil {
err = fmt.Errorf("connect host %s error: %s", s.Host, err)
err = fmt.Errorf("connect host %sc 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 sc.proxyConn != nil {
err = sc.proxyConn.Close()
}
return err
}
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)
}
......@@ -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,
......
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 cctx.Context) {
func (i *InteractiveHandler) Dispatch(ctx context.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()
}
// /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment