in pkg/sshd/ssh_exec.go [137:193]
func handleNoTTY(cmd *exec.Cmd, s *session) error {
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Println(err, "couldn't get StdoutPipe")
return err
}
stderr, err := cmd.StderrPipe()
if err != nil {
log.Println(err, "couldn't get StderrPipe")
return err
}
stdin, err := cmd.StdinPipe()
if err != nil {
log.Println(err, "couldn't get StdinPipe")
return err
}
if err = cmd.Start(); err != nil {
log.Println(err, "couldn't start command '%s'", cmd.String())
return err
}
go func() {
defer stdin.Close()
if _, err := io.Copy(stdin, s); err != nil {
log.Println(err, "failed to write session to stdin.")
}
}()
wg := &sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
if _, err := io.Copy(s, stdout); err != nil {
log.Println(err, "failed to write stdout to session.")
}
}()
wg.Add(1)
go func() {
defer wg.Done()
if _, err := io.Copy(s.Stderr(), stderr); err != nil {
log.Println(err, "failed to write stderr to session.")
}
}()
wg.Wait()
if err := cmd.Wait(); err != nil {
log.Println(err, "command failed while waiting")
return err
}
return nil
}