ssh/tailssh: fix terminal corruption (temporary hack)

Maisem figured out the real problem but will take several commits
(e.g. tailscale/ssh#2) in different repos to get it fixed
properly. This is an interim hack.

Details of real fix:
https://github.com/tailscale/tailscale/issues/4146#issuecomment-1065952947

Updates #4146
Updates #3802

Change-Id: I7b7dc5713baa3e5de75b87b69e7179a6e7549b0b
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
pull/4154/head
Brad Fitzpatrick 3 years ago committed by Brad Fitzpatrick
parent ba1adf6c24
commit 012098ec32

@ -19,6 +19,7 @@ import (
"os" "os"
"os/exec" "os/exec"
"os/user" "os/user"
"reflect"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -375,7 +376,14 @@ func (srv *server) handleAcceptedSSH(ctx context.Context, s ssh.Session, ci *ssh
stdin.Close() stdin.Close()
}() }()
go func() { go func() {
_, err := io.Copy(s, stdout) // Write to s.Channel directly, avoiding gliderlab/ssh's (*session).Write
// call that translates newline endings, which we don't need.
// See https://github.com/tailscale/tailscale/issues/4146.
// TODO(bradfitz,maisem): remove this reflect hackery once gliderlab/ssh changes
// are all in.
// s is an gliderlabs/ssh.(*session); write to its Channel field.
sshChan := reflect.ValueOf(s).Elem().FieldByName("Channel").Interface().(io.Writer)
_, err := io.Copy(sshChan, stdout)
if err != nil { if err != nil {
// TODO: don't log in the success case. // TODO: don't log in the success case.
logf("ssh: stdout copy: %v", err) logf("ssh: stdout copy: %v", err)

Loading…
Cancel
Save