Piszę program Go, który połączy się z hostem przez SSH, używając natywnej biblioteki x/crypto/ssh i usunie powłokę interpolowaną.Jak mogę wysłać sekwencje specjalne terminala przez SSH za pomocą Go?
Używam RequestPty()
, ale powłoka (bash) na zdalnym końcu nie zachowuje się zgodnie z oczekiwaniami z kodami kontrolnymi.
Kiedy wprowadzić różne znaki sterujące, oni echo mojego terminalu:
$ ^[[A
Znaki nadal pracy w tym sensie, że jeśli naciśnij enter po naciśnięciu strzałki w górę, poprzednia komenda jest uruchomione - ale wyjście z postaci sterującej blokuje to, co powinno być tam wyświetlane. To samo dotyczy zakładki.
Czy jest jakiś prosty sposób, aby to zadziałało? Kiedy już zaimplementowałem podobne systemy w przeszłości, nie było to problemem, ponieważ właśnie wyjąłem numer openssh
, a semantyka grup procesów wszystko to uporządkuje.
Studiowałem "The TTY Demystified" i tak dobre, jak to jest nie wiadomo od czego zacząć.
Kilka rzeczy myślałem o zbadanie:
- enable raw mode in my terminal - ale nie chcę, aby to zrobić, nie rozumiejąc dlaczego, i to nie nie wydają aby zrobić dobry uczynek
- fiddle with the terminal mode flags
sobie openssh
należy robić tę pracę poprawnie, ale to naprawdę najlepszy bazy kodu na studia.
Nie jest dla mnie jasne, czy ten wydruk jest wykonywany przez mój lokalny emulator terminalu lub powłokę, czy przez kod na zdalnym hoście.
Od czego zacząć?
Oto przykład z mojego kodu:
conf := ssh.ClientConfig{
User: myuser,
Auth: []ssh.AuthMethod{ssh.Password(my_password)}
}
conn, err := ssh.Dial("tcp", myhost, conf)
if err != nil {
return err
}
defer conn.Close()
session, err := conn.NewSession()
if err != nil {
return err
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
modes := ssh.TerminalModes{
ssh.ECHO: 0
ssh.TTY_OP_ISPEED: 14400,
ssh.TTY_OP_OSPEED: 14400
}
if err := session.RequestPty("xterm", 80, 40, modes); err != nil {
return err
}
if err = session.Shell(); err != nil {
return err
}
return session.Wait()
Próbowałem to z wartościami określony inny niż xterm
: screen-256color
i vt100
.
Dla przypomnienia - w rzeczywistym kodzie, a nie tylko wezwanie do session.Wait()
mam for/select
pętlę, która łapie różne sygnały do procesu i wysyła je do Session
.
Czy próbowałeś wyłączyć tryb terminala 'ECHOCTL'? –
@EmilDavtyan to naprawił! Teraz, aby zrozumieć, dlaczego. – Cera
@Cerales Pamiętaj, aby odpowiedzieć na własne pytanie i zaakceptować odpowiedź :) – user918176