func handleConnToTunnel(sshClient *ssh.Client, dbUrl *url.URL, sock net.Conn, errs chan error) { connID := <-connIDGenerator fmt.Printf("Connect to %s [%v]\n", dbUrl.Host, connID) conn, err := sshClient.Dial("tcp", dbUrl.Host) if err != nil { errs <- err return } wg := &sync.WaitGroup{} wg.Add(2) go func() { io.Copy(sock, conn) sock.Close() wg.Done() }() go func() { io.Copy(conn, sock) conn.Close() wg.Done() }() wg.Wait() fmt.Printf("End of connection [%d]\n", connID) }
// ForwardToAgent routes authentication requests to the given keyring. func ForwardToAgent(client *ssh.Client, keyring Agent) error { channels := client.HandleChannelOpen(channelType) if channels == nil { return errors.New("agent: already have handler for " + channelType) } go func() { for ch := range channels { channel, reqs, err := ch.Accept() if err != nil { continue } go ssh.DiscardRequests(reqs) go func() { ServeAgent(keyring, channel) channel.Close() }() } }() return nil }
// ForwardToRemote routes authentication requests to the ssh-agent // process serving on the given unix socket. func ForwardToRemote(client *ssh.Client, addr string) error { channels := client.HandleChannelOpen(channelType) if channels == nil { return errors.New("agent: already have handler for " + channelType) } conn, err := net.Dial("unix", addr) if err != nil { return err } conn.Close() go func() { for ch := range channels { channel, reqs, err := ch.Accept() if err != nil { continue } go ssh.DiscardRequests(reqs) go forwardUnixSocket(channel, addr) } }() return nil }