Estou escrevendo um serviço bastion simples que registrará a entrada/saída de uma sessão ssh. A parte da conexão ssh se parece com:
func connect(user, host string, logger sessionLogger) error {
cmd := exec.Command("ssh", user+"@"+host)
t, err := pty.Start(cmd)
if err != nil {
return err
}
defer t.Close()
go func() {
buf := make([]byte, 1024)
for {
n, err := t.Read(buf)
if err != nil {
break
}
os.Stdout.Write(buf[:n])
logger(buf[:n])
}
}()
go func() { io.Copy(t, os.Stdin) }()
return cmd.Wait()
}
O problema é que todos os comandos inseridos pelo usuário são ecoados no PTY duas vezes, assim:
Tentei brincar com o stdin/stdout de um cmd, inclusive não usando o pty, mas tive vários problemas estranhos, por exemplo, nenhuma saída do prompt de comando, etc., a maioria deles relacionados à natureza do stdout de um comando (deve ser um pty).
Este é o melhor resultado que tenho agora. Mas preciso eliminar o eco excessivo do comando.
Você precisa usar o modo raw para evitar entradas duplicadas