Golang中的交互式安全shell无法捕获所有键盘

时间:2016-08-18 12:18:36

标签: shell go ssh

我正在尝试使用Golang与远程计算机启动交互式SSH会话。我能够毫无问题地得到它,但伪终端似乎没有正确捕获所有键盘i / o。

例如,如果我运行常规SSH命令,如

ssh -i ~/.ssh/some-key.pem username@1.1.1.1

我可以使用简单的Ctrl+d退出,但出于某种原因,当我运行以Golang开头的交互式shell时,它不起作用,只打印实际的关键字符^D。尝试使用箭头键也是如此。如果我运行Ctrl+c它退出原始Golang进程并杀死交互式shell而不是在远程计算机上执行。

以下是我设置shell的代码,

func StartInteractiveShell(sshConfig *ssh.ClientConfig, network string, host string, port string) error {
    var (
        session *ssh.Session
        conn    *ssh.Client
        err     error
    )    
    if conn, err = getSshConnection(sshConfig, network, host, port); err != nil {
        fmt.Printf("Failed to dial: %s", err)
        return err   
    }

    if session, err = getSshSession(conn); err != nil {
        fmt.Printf("Failed to create session: %s", err)
        return err
    }
    defer session.Close()

    if err = setupPty(session); err != nil {
        fmt.Printf("Failed to set up pseudo terminal: %s", err)
        return err
    }

    session.Stdout = os.Stdout
    session.Stdin  = os.Stdin
    session.Stderr = os.Stderr

    if err = session.Shell(); err != nil {
        fmt.Printf("Failed to start interactive shell: %s", err)
        return err
    }
    return session.Wait()
}

func getSshConnection(config *ssh.ClientConfig, network string, host string, port string) (*ssh.Client, error) {
    addr := host + ":" + port
    return ssh.Dial(network, addr, config)
}

func getSshSession(clientConnection *ssh.Client) (*ssh.Session, error) {
    return clientConnection.NewSession()
}

// pty = pseudo terminal
func setupPty(session *ssh.Session) error {
    modes := ssh.TerminalModes{
        ssh.ECHO:          0,     // disable echoing
        ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
        ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
    }

    if err := session.RequestPty("xterm", 80, 40, modes); err != nil {
        session.Close()
        fmt.Printf("request for pseudo terminal failed: %s", err)
        return err
    }
    return nil
}

我错过了什么吗?

0 个答案:

没有答案