func TestStart(t *testing.T) { clientConfig := &ssh.ClientConfig{ User: "******", Auth: []ssh.ClientAuth{ ssh.ClientAuthPassword(password("pass")), }, } conn := func() (net.Conn, error) { conn, err := net.Dial("tcp", newMockLineServer(t)) if err != nil { t.Fatalf("unable to dial to remote side: %s", err) } return conn, err } config := &Config{ Connection: conn, SSHConfig: clientConfig, } client, err := New(config) if err != nil { t.Fatalf("error connecting to SSH: %s", err) } var cmd packer.RemoteCmd stdout := new(bytes.Buffer) cmd.Command = "echo foo" cmd.Stdout = stdout client.Start(&cmd) }
func TestNew_Invalid(t *testing.T) { clientConfig := &ssh.ClientConfig{ User: "******", Auth: []ssh.ClientAuth{ ssh.ClientAuthPassword(password("i-am-invalid")), }, } conn := func() (net.Conn, error) { conn, err := net.Dial("tcp", newMockLineServer(t)) if err != nil { t.Fatalf("unable to dial to remote side: %s", err) } return conn, err } config := &Config{ Connection: conn, SSHConfig: clientConfig, } _, err := New(config) if err == nil { t.Fatal("should have had an error connecting") } }
func (d *ESX5Driver) connect() error { address := fmt.Sprintf("%s:%d", d.Host, d.Port) auth := []gossh.ClientAuth{ gossh.ClientAuthPassword(ssh.Password(d.Password)), gossh.ClientAuthKeyboardInteractive( ssh.PasswordKeyboardInteractive(d.Password)), } // TODO(dougm) KeyPath support sshConfig := &ssh.Config{ Connection: ssh.ConnectFunc("tcp", address), SSHConfig: &gossh.ClientConfig{ User: d.Username, Auth: auth, }, NoPty: true, } comm, err := ssh.New(sshConfig) if err != nil { return err } d.comm = comm return nil }
func (ss *ScpStorage) Connect() error { var err error clientConfig := &ssh.ClientConfig{ User: ss.User, Auth: []ssh.ClientAuth{ ssh.ClientAuthPassword(password(ss.Password)), ssh.ClientAuthKeyring(ss.Keychain), }, } ss.connexion, err = ssh.Dial("tcp", ss.Endpoint, clientConfig) if err != nil { return fmt.Errorf("Failed to dial: %s", err.Error()) } return nil }
func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*gossh.ClientConfig, error) { return func(state multistep.StateBag) (*gossh.ClientConfig, error) { auth := []gossh.ClientAuth{ gossh.ClientAuthPassword(ssh.Password(config.SSHPassword)), gossh.ClientAuthKeyboardInteractive( ssh.PasswordKeyboardInteractive(config.SSHPassword)), } if config.SSHKeyPath != "" { keyring, err := sshKeyToKeyring(config.SSHKeyPath) if err != nil { return nil, err } auth = append(auth, gossh.ClientAuthKeyring(keyring)) } return &gossh.ClientConfig{ User: config.SSHUser, Auth: auth, }, nil } }
// SSHConfig returns a function that can be used for the SSH communicator // config for connecting to the specified host via SSH // private_key_file has precedence over password! func SSHConfig(username string, password string, privateKeyFile string) func(multistep.StateBag) (*gossh.ClientConfig, error) { return func(state multistep.StateBag) (*gossh.ClientConfig, error) { if privateKeyFile != "" { // key based auth bytes, err := ioutil.ReadFile(privateKeyFile) if err != nil { return nil, fmt.Errorf("Error setting up SSH config: %s", err) } privateKey := string(bytes) keyring := new(ssh.SimpleKeychain) if err := keyring.AddPEMKey(privateKey); err != nil { return nil, fmt.Errorf("Error setting up SSH config: %s", err) } return &gossh.ClientConfig{ User: username, Auth: []gossh.ClientAuth{ gossh.ClientAuthKeyring(keyring), }, }, nil } else { // password based auth return &gossh.ClientConfig{ User: username, Auth: []gossh.ClientAuth{ gossh.ClientAuthPassword(ssh.Password(password)), gossh.ClientAuthKeyboardInteractive(ssh.PasswordKeyboardInteractive(password)), }, }, nil } } }