func TestOpenRetry(t *testing.T) { c := 0 rand := new(failReader) p := &Pool{Dial: func(net, addr string) (net.Conn, error) { c++ conn := dial(t) return conn, nil }} config := new(ssh.ClientConfig) *config = *clientConfig config.Rand = rand _, err := p.Open("net", "addr", config) if err != nil { t.Fatal("unexpected error:", err) } conn := p.tab[p.key("net", "addr", config)].c *rand = true config.Rand = nil _, err = p.Open("net", "addr", config) if err != nil { t.Fatal("unexpected error:", err) } if c != 2 { t.Fatalf("calls = %d want 2", c) } const errClosing = "use of closed network connection" // from package net if err := conn.Close(); err == nil || err.Error() != errClosing { t.Fatalf("conn still open, want closed; err = %v", err) } }
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() }
func sshConfig(state multistep.StateBag) (*ssh.ClientConfig, error) { config := state.Get("config").(config) clientConfig := ssh.ClientConfig{User: config.SSHUsername} if config.OsSnapshot == "" && config.IpxeUrl == "" { // default case where vultr generated the password password := state.Get("default_password").(string) clientConfig.Auth = []ssh.AuthMethod{ssh.Password(password)} } else if config.SSHPassword != "" { // special case but we got a password clientConfig.Auth = []ssh.AuthMethod{ssh.Password(config.SSHPassword)} } else { // special case and we got a key signer, err := ssh.ParsePrivateKey([]byte(config.SSHPrivateKey)) if err != nil { return nil, fmt.Errorf("Error setting up SSH config: %s", err) } clientConfig.Auth = []ssh.AuthMethod{ssh.PublicKeys(signer)} } return &clientConfig, nil }
func sshClientConfig(user string, checker *HostKeyChecker) (*gossh.ClientConfig, error) { agentClient, err := SSHAgentClient() if err != nil { return nil, err } signers, err := agentClient.Signers() if err != nil { return nil, err } cfg := gossh.ClientConfig{ User: user, Auth: []gossh.AuthMethod{ gossh.PublicKeys(signers...), }, } if checker != nil { cfg.HostKeyCallback = checker.Check } return &cfg, nil }