我正在编写一个 Go 程序,该程序将使用本机x/crypto/ssh库通过 SSH 连接到主机并删除交互式 shell。
我正在使用RequestPty(),但远程端的 (bash) shell 与控制代码的行为不一样。
当我输入各种控制字符时,它们会被我的终端回显:
$ ^[[A
从某种意义上说,字符仍然有效,如果我在按向上箭头后按 Enter,则运行上一个命令 - 但控制字符输出会破坏应该在那里显示的内容。选项卡也是如此。
有没有一些简单的方法可以让它发挥作用?当我过去实施过类似的系统时,这不是问题,因为我刚刚投入到openssh,并且进程组的语义将其全部解决。
我已经研究过“ The TTY Demystified ”,尽管它很棒,但不清楚从哪里开始。
我想调查的几件事:
在我的终端使原始模式-但我并不想这样做,不理解为什么,它不似乎做正确的事
摆弄终端模式标志
openssh 本身必须正确地完成这项工作,但它是一个真正最好的代码库研究。
我实际上不清楚这个打印是由我的本地终端仿真器或外壳程序完成的,还是由远程主机上的代码完成的。
我从哪开始呢?
这是我的代码示例:
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()
我已经尝试过使用xterm:screen-256color和以外的术语值进行此操作vt100。
为了记录 - 在真实的代码中session.Wait(),我有一个for/select循环,它可以捕获到进程的各种信号并将它们发送到Session.
回首忆惘然
弑天下
相关分类