关闭终端中的回显 - 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.TCGETA
和unix.TCSAFLUSH
,而是使用unix.TCGETS
和unix.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 上的回显位