func (v *vm) Run(command string, s *Streams) error { if s == nil { s = &Streams{} } var sc *ssh.Client err := sshAttempts.Run(func() (err error) { if s.Stderr != nil { fmt.Fprintf(s.Stderr, "Attempting to ssh to %s:22...\n", v.IP()) } sc, err = v.DialSSH() return }) if err != nil { return err } defer sc.Close() sess, err := sc.NewSession() sess.Stdin = s.Stdin sess.Stdout = s.Stdout sess.Stderr = s.Stderr if err := sess.Run(command); err != nil { return fmt.Errorf("failed to run command on %s: %s", v.IP(), err) } return nil }
func (v *vm) Run(command string, attempts attempt.Strategy, out io.Writer, stderr io.Writer) error { var sc *ssh.Client err := attempts.Run(func() (err error) { fmt.Fprintf(stderr, "Attempting to ssh to %s:22...\n", v.IP()) sc, err = v.DialSSH() return }) if err != nil { return err } defer sc.Close() sess, err := sc.NewSession() sess.Stdin = bytes.NewBufferString(command) sess.Stdout = out sess.Stderr = stderr if err := sess.Run("bash"); err != nil { return fmt.Errorf("failed to run command on %s: %s", v.IP(), err) } return nil }
// 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 }