如何在终端中隐藏用户输入(密码字段),类似于bash中-s
中的read -s p "password " password
命令。 ?
var password string
fmt.Println("password: ")
fmt.Scan(&password)
答案 0 :(得分:9)
最好的方法是使用终端包中的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))
}
}
答案 1 :(得分:3)
我不知道去哪,所以我不确定你是否可以打电话给其他节目。如果是这样,只需调用 stty -echo 隐藏输入,然后调用 stty echo 再次显示。
否则你可以尝试以下方法:
fmt.Println("password: ")
fmt.Println("\033[8m") // Hide input
fmt.Scan(&password)
fmt.Println("\033[28m") // Show input
答案 2 :(得分:0)
我为此尝试了几种不同的方法并发现了问题(例如,如果等待密码,Ctrl + C不会中断程序)。
这就是我最终的工作方式 - 这在OSX中完美运行。 Haven在其他环境中尝试过:
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
}
答案 3 :(得分:0)
要支持Windows,如here所述,请使用:
import "syscall"
import "golang.org/x/crypto/ssh/terminal"
passwd, err := terminal.ReadPassword(int(syscall.Stdin))