// NewClient connects to the given host via SSH, the client will support // agent forwarding but it must also be enabled per-session. func (a *SSHAgent) NewClient(host string) (*ssh.Client, error) { sshcfg := ssh.ClientConfig{ User: a.User, Auth: []ssh.AuthMethod{ ssh.PublicKeysCallback(a.Signers), }, } addr := ensurePortSuffix(host, defaultPort) tcpconn, err := a.Dial("tcp", addr) if err != nil { return nil, err } sshconn, chans, reqs, err := ssh.NewClientConn(tcpconn, addr, &sshcfg) if err != nil { return nil, err } client := ssh.NewClient(sshconn, chans, reqs) err = agent.ForwardToAgent(client, a) if err != nil { client.Close() return nil, err } return client, nil }
func TestAuth(t *testing.T) { a, b, err := netPipe() if err != nil { t.Fatalf("netPipe: %v", err) } defer a.Close() defer b.Close() agent, _, cleanup := startAgent(t) defer cleanup() if err := agent.Add(testPrivateKeys["rsa"], nil, "comment"); err != nil { t.Errorf("Add: %v", err) } serverConf := ssh.ServerConfig{} serverConf.AddHostKey(testSigners["rsa"]) serverConf.PublicKeyCallback = func(c ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { if bytes.Equal(key.Marshal(), testPublicKeys["rsa"].Marshal()) { return nil, nil } return nil, errors.New("pubkey rejected") } go func() { conn, _, _, err := ssh.NewServerConn(a, &serverConf) if err != nil { t.Fatalf("Server: %v", err) } conn.Close() }() conf := ssh.ClientConfig{} conf.Auth = append(conf.Auth, ssh.PublicKeysCallback(agent.Signers)) conn, _, _, err := ssh.NewClientConn(b, "", &conf) if err != nil { t.Fatalf("NewClientConn: %v", err) } conn.Close() }