in pkg/sshd/ssh_exec.go [84:124]
func handlePTY(cmd *exec.Cmd, s *session, ptyReq Pty, winCh <-chan Window) error {
if len(ptyReq.Term) > 0 {
cmd.Env = append(cmd.Env, fmt.Sprintf("TERM=%s", ptyReq.Term))
}
f, err := pty.Start(cmd)
if err != nil {
log.Println("failed to start pty session", err)
return err
}
go func() {
for win := range winCh {
setWinsize(f, win.Width, win.Height)
}
}()
go func() {
io.Copy(f, s) // stdin
}()
waitCh := make(chan struct{})
go func() {
defer close(waitCh)
io.Copy(s, f) // stdout
}()
if err := cmd.Wait(); err != nil {
log.Println("pty command failed while waiting", err)
return err
}
select {
case <-waitCh:
log.Println("stdout finished")
case <-time.NewTicker(1 * time.Second).C:
log.Println("stdout didn't finish after 1s")
}
return nil
}