Yerel bir x/crypto/ssh kitaplığını kullanarak SSH aracılığıyla bir ana bilgisayara bağlanacak ve bir interaktif kabuk bırakacak bir Go programı yazıyorum.Terminal kaçış dizilerini Go ile SSH'den nasıl gönderebilirim?
RequestPty()
kullanıyorum, ancak uzak uçtaki (bash) kabuğu, denetim kodlarında beklendiği gibi davranmıyor.
Çeşitli denetim karakterleri girmek
, onlar benim terminali tarafından geri yankılandı ediyoruz:$ ^[[A
karakterden hala eser anlamda ben yukarı ok bastıktan sonra enter tuşuna değilse, önceki komut çalıştırılır - ancak kontrol karakteri çıkışı, orada nelerin görüntülenmesi gerektiğini gösterir. Aynı sekme için de geçerli.
Bunu işe almak için bazı kolay yol var mı? Geçmişte benzer sistemler kurduğumda bu bir sorun olmamıştı çünkü openssh
'a bağlandım ve süreç gruplarının semantikleri hepsini çözdü.
"The TTY Demystified" üzerinde çalıştım ve bunun nereden başlayacağı net değil.
bunu araştırmak için düşündüm birkaç şey:
- enable raw mode in my terminal - ama neden anlamadan bunu yapmak istemiyorum ve doğru olanı yapmak için görünmüyor gelmez fiddle with the terminal mode flags
openssh
kendisi
Bu yazdırma işleminin yerel terminal öykünücüsü veya kabuk veya uzak ana bilgisayardaki kod tarafından yapılıp yapılmadığı bana açık değil.
Nereden başlamalıyım? screen-256color
ve vt100
: Ben terim değerlerinden diğer xterm
daha bu denedim
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()
: Burada
benim kod bir örnektir. Kayıt için - Gerçek kodda yerine
session.Wait()
için sadece bir çağrının, ben sürecine çeşitli sinyaller yakalar ve Session
onları üzerinde gönderen bir for/select
döngü var.
'ECHOCTL' terminal modunu devre dışı bırakmayı denediniz mi? –
@EmilDavtyan bunu çözdü! Şimdi nedenini anlamak için. – Cera
@Cerales Lütfen kendi sorunuzu cevaplamayı ve cevabı kabul etmeyi unutmayın :) – user918176