mirror of
https://github.com/moul/sshportal.git
synced 2025-10-26 22:16:05 +08:00
add an acceptable error management.
This commit is contained in:
parent
c3d49fde95
commit
e9eef9a49e
2 changed files with 33 additions and 10 deletions
|
|
@ -29,6 +29,7 @@ type Config struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.NewChannel, ctx ssh.Context, configs []Config) error {
|
func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.NewChannel, ctx ssh.Context, configs []Config) error {
|
||||||
|
var lastClient *gossh.Client
|
||||||
switch newChan.ChannelType() {
|
switch newChan.ChannelType() {
|
||||||
case "session" :
|
case "session" :
|
||||||
lch, lreqs, err := newChan.Accept()
|
lch, lreqs, err := newChan.Accept()
|
||||||
|
|
@ -38,7 +39,6 @@ func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastClient *gossh.Client
|
|
||||||
|
|
||||||
// go through all the hops
|
// go through all the hops
|
||||||
for _, config := range configs {
|
for _, config := range configs {
|
||||||
|
|
@ -62,6 +62,7 @@ func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.
|
||||||
defer func() { _ = client.Close() }()
|
defer func() { _ = client.Close() }()
|
||||||
lastClient = client
|
lastClient = client
|
||||||
}
|
}
|
||||||
|
|
||||||
rch, rreqs, err := lastClient.OpenChannel("session", []byte{})
|
rch, rreqs, err := lastClient.OpenChannel("session", []byte{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -76,24 +77,41 @@ func MultiChannelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.
|
||||||
// TODO: trigger event callback
|
// TODO: trigger event callback
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// open client channel
|
// go through all the hops
|
||||||
rconn, err := gossh.Dial("tcp", config.Addr, config.ClientConfig)
|
for _, config := range configs {
|
||||||
if err != nil {
|
var client *gossh.Client
|
||||||
return err
|
if lastClient == nil {
|
||||||
|
client, err = gossh.Dial("tcp", config.Addr, config.ClientConfig)
|
||||||
|
} else {
|
||||||
|
rconn, err := lastClient.Dial("tcp", config.Addr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ncc, chans, reqs, err := gossh.NewClientConn(rconn, config.Addr, config.ClientConfig)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
client = gossh.NewClient(ncc, chans, reqs)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() { _ = client.Close() }()
|
||||||
|
lastClient = client
|
||||||
}
|
}
|
||||||
defer func() { _ = rconn.Close() }()
|
|
||||||
d := logtunnel.ForwardData{}
|
d := logtunnel.ForwardData{}
|
||||||
if err := gossh.Unmarshal(newChan.ExtraData(), &d); err != nil {
|
if err := gossh.Unmarshal(newChan.ExtraData(), &d); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
rch, rreqs, err := rconn.OpenChannel("direct-tcpip", newChan.ExtraData())
|
rch, rreqs, err := lastClient.OpenChannel("direct-tcpip", newChan.ExtraData())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
user := conn.User()
|
user := conn.User()
|
||||||
// pipe everything
|
// pipe everything
|
||||||
return pipe(lreqs, rreqs, lch, rch, config.Logs, user, newChan)
|
return pipe(lreqs, rreqs, lch, rch, configs[len(configs)-1].Logs, user, newChan)
|
||||||
default:
|
default:
|
||||||
newChan.Reject(gossh.UnknownChannelType, "unsupported channel type")
|
newChan.Reject(gossh.UnknownChannelType, "unsupported channel type")
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
7
ssh.go
7
ssh.go
|
|
@ -158,7 +158,12 @@ func channelHandler(srv *ssh.Server, conn *gossh.ServerConn, newChan gossh.NewCh
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bastionsession.MultiChannelHandler(srv, conn, newChan, ctx, sessionConfigs)
|
go func() {
|
||||||
|
err = bastionsession.MultiChannelHandler(srv, conn, newChan, ctx, sessionConfigs)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
sessUpdate := Session{
|
sessUpdate := Session{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue