func NewTunnelledSSHClient(user, tunaddr, tgtaddr string) (*gossh.ClientConn, error) { clientConfig, err := sshClientConfig(user) if err != nil { return nil, err } var tunnelClient *gossh.ClientConn dialFunc := func(echan chan error) { var err error tunnelClient, err = gossh.Dial("tcp", tunaddr, clientConfig) echan <- err } err = timeoutSSHDial(dialFunc) if err != nil { return nil, err } var targetConn net.Conn dialFunc = func(echan chan error) { var err error targetConn, err = tunnelClient.Dial("tcp", tgtaddr) echan <- err } err = timeoutSSHDial(dialFunc) if err != nil { return nil, err } targetClient, err := gossh.Client(targetConn, clientConfig) if err != nil { return nil, err } return targetClient, nil }
func (s *server) TryDial(config *ssh.ClientConfig) (*ssh.ClientConn, error) { sshd, err := exec.LookPath("sshd") if err != nil { s.t.Skipf("skipping test: %v", err) } c1, c2, err := unixConnection() if err != nil { s.t.Fatalf("unixConnection: %v", err) } s.cmd = exec.Command(sshd, "-f", s.configfile, "-i", "-e") f, err := c2.File() if err != nil { s.t.Fatalf("UnixConn.File: %v", err) } defer f.Close() s.cmd.Stdin = f s.cmd.Stdout = f s.cmd.Stderr = &s.output if err := s.cmd.Start(); err != nil { s.t.Fail() s.Shutdown() s.t.Fatalf("s.cmd.Start: %v", err) } s.clientConn = c1 return ssh.Client(c1, config) }
func NewTunnelledSSHClient(user, tunaddr, tgtaddr string) (*gossh.ClientConn, error) { clientConfig := sshClientConfig(user) tunnelClient, err := gossh.Dial("tcp", tunaddr, clientConfig) if err != nil { return nil, err } targetConn, err := tunnelClient.Dial("tcp", tgtaddr) if err != nil { return nil, err } targetClient, err := gossh.Client(targetConn, clientConfig) if err != nil { return nil, err } return targetClient, nil }