关闭终端中的回显 - Golang

Turn off echoing in terminal - Golang

我正在尝试关闭终端中的回显,在 Golang 中,

代码:

func main() {
    
    STDINFILE := os.Stdin
    STDINFILENO := 0

    raw, err := unix.IoctlGetTermios(STDINFILENO, unix.TCGETA)
    if err != nil {
        panic(err)
    }
    rawState := *raw

    rawState.Lflag &^= unix.ECHO

    err = unix.IoctlSetTermios(STDINFILENO, unix.TCSAFLUSH, &rawState)

    if err != nil {
        panic(err)
    }

    var charValue byte
    reader := bufio.NewReader(STDINFILE)
    
    for {
        var err error
        // read one byte
        charValue, err = reader.ReadByte()
        if err != nil {
            if err == io.EOF {
                fmt.Println("END OF FILE")
            }
        }
        // press q to quit.
        if charValue == 'q' {
            os.Exit(0)
        }

    }
}

但它没有按预期工作

我仍然能够看到回显值,

我做错了什么,有人可以指出或指导我吗?

问题出在 tcsetattr - parameters err = unix.IoctlSetTermios(STDINFILENO, unix.TCSAFLUSH, &rawState)

采取行动 TCSAFLUSH,

DOC 建议:

TCSADRAIN Make the change after waiting until all queued output has been written. You should usually use this option when changing parameters that affect output. TCSAFLUSH This is like TCSADRAIN, but also discards any queued input.

所以上面例子中的 termios 将字符发送回左边(“master” pty),因为在这种情况下 ECHO 直到输出被写入shell(“从属”企业)。

将操作更改为 TCSANOW - the change shall occur immediately 立即关闭回声。