关闭终端中的回显 - Golang

Posted

技术标签:

【中文标题】关闭终端中的回显 - Golang【英文标题】:Turn off echoing in terminal - Golang 【发布时间】:2018-09-07 03:29:49 【问题描述】:

我正在尝试在 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)
        

    

但它没有按预期工作

我仍然能够看到回显的值,

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

【问题讨论】:

你不使用terminal.ReadPassword有什么原因吗? 是的,原因是试图从更基础的层面学习这个概念。 您总是可以看到terminal.ReadPassword 实现here。它或多或少与您的相同,但不是使用unix.TCGETAunix.TCSAFLUSH,而是使用unix.TCGETSunix.TCSETS... 请不要包含文本的屏幕截图。最好将文本直接复制并粘贴到问题中。 @people downvoting,如果您能提供原因,我们将不胜感激。 【参考方案1】:

问题出在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 将字符发送回左侧(“主”pty),因为在这种情况下ECHO 直到输出写入shell( “奴隶” pty)。

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

【讨论】:

以上是关于关闭终端中的回显 - Golang的主要内容,如果未能解决你的问题,请参考以下文章

为啥“stty -echo”没有关闭 macOS 上的回显位

从 IDLE 运行时“GetPassWarning:无法控制终端上的回显”

提交表单数据,List的回显。注意类型对应。

Golanggolang 终端命令

GoLanggolang 终端命令

重定向 Windows 批处理文件命令的回显