95 lines
2.0 KiB
Go
95 lines
2.0 KiB
Go
package breacher
|
|
|
|
import (
|
|
"log"
|
|
"net"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
sPasswd string
|
|
sKey string
|
|
)
|
|
|
|
var sshCmd = &cobra.Command{
|
|
Use: "tunnel [from address] [to address] [user@host:port]",
|
|
Short: "ssh tunneling to access remote services",
|
|
Long: `ssh tunneling to access remote services
|
|
ex.
|
|
breacher forward :8080 kumoly.io:5080
|
|
breacher forward :8080 :8000
|
|
breacher forward --udp :8080 192.168.51.211:53
|
|
`,
|
|
Args: cobra.ExactArgs(3),
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
localHost, localPortStr, err := net.SplitHostPort(args[0])
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
remoteHost, remotePortStr, err := net.SplitHostPort(args[1])
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
localPort, err := strconv.Atoi(localPortStr)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
remotePort, err := strconv.Atoi(remotePortStr)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
if localHost == "" {
|
|
localHost = "localhost"
|
|
}
|
|
if remoteHost == "" {
|
|
remoteHost = "localhost"
|
|
}
|
|
st := NewSSHTunnel(localHost, localPort, remoteHost, remotePort)
|
|
split := strings.Split(args[2], "@")
|
|
if len(split) != 2 {
|
|
log.Fatalln("ssh host name not valid")
|
|
}
|
|
usr := split[0]
|
|
sshHost := "localhost"
|
|
sshPort := 22
|
|
if !strings.Contains(split[1], ":") {
|
|
sshHost = split[1]
|
|
} else {
|
|
sshPortStr := ""
|
|
sshHost, sshPortStr, err = net.SplitHostPort(split[1])
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
if sshHost == "" {
|
|
log.Fatalln("no ssh host")
|
|
}
|
|
if sshPortStr != "" {
|
|
sshPort, err = strconv.Atoi(sshPortStr)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
st.server.Host = sshHost
|
|
st.SetPort(sshPort)
|
|
st.SetUser(usr)
|
|
st.SetPassword("ubuntu")
|
|
st.SetDebug(true)
|
|
st.SetConnState(func(tun *SSHTun, state ConnState) {
|
|
switch state {
|
|
case StateStarting:
|
|
log.Printf("STATE is Starting")
|
|
case StateStarted:
|
|
log.Printf("STATE is Started")
|
|
case StateStopped:
|
|
log.Printf("STATE is Stopped")
|
|
}
|
|
})
|
|
log.Fatalln(st.Start())
|
|
},
|
|
}
|