【发布时间】:2015-05-21 02:57:12
【问题描述】:
如何在终端中隐藏用户输入(密码字段),类似于 bash 中 read -s p "password " password 中的 -s 命令。 ?
var password string
fmt.Println("password: ")
fmt.Scan(&password)
【问题讨论】:
标签: go
如何在终端中隐藏用户输入(密码字段),类似于 bash 中 read -s p "password " password 中的 -s 命令。 ?
var password string
fmt.Println("password: ")
fmt.Scan(&password)
【问题讨论】:
标签: go
最好的方法是使用终端包中的ReadPassword()。否则,您也可以查看此question 以了解更多方法。
代码示例:
package main
import "golang.org/x/crypto/ssh/terminal"
import "fmt"
func main() {
fmt.Println("Enter password: ")
password, err := terminal.ReadPassword(0)
if err == nil {
fmt.Println("Password typed: " + string(password))
}
}
【讨论】:
我不知道go,所以我不确定你是否可以调用其他程序。如果是这样,只需调用 stty -echo 隐藏输入并调用 stty echo 再次显示它。
否则您可以尝试以下方法:
fmt.Println("password: ")
fmt.Println("\033[8m") // Hide input
fmt.Scan(&password)
fmt.Println("\033[28m") // Show input
【讨论】:
要支持windows,如here所述,请使用:
import "syscall"
import "golang.org/x/crypto/ssh/terminal"
passwd, err := terminal.ReadPassword(int(syscall.Stdin))
【讨论】:
我为此尝试了几种不同的方法并发现了问题(例如,如果正在等待密码,则 Ctrl+C 不会中断程序)。
这就是我最终让它工作的方式 - 这在 OSX 中完美运行。其他环境没试过:
import (
"log"
"code.google.com/p/go.crypto/ssh/terminal"
"github.com/seehuhn/password"
)
func StringPrompt() (password string, err error) {
state, err := terminal.MakeRaw(0)
if err != nil {
log.Fatal(err)
}
defer terminal.Restore(0, state)
term := terminal.NewTerminal(os.Stdout, "")
password, err = term.ReadLine()
if err != nil {
log.Fatal(err)
}
return
}
【讨论】: