在扫描功能中使用户输入静音

时间:2015-05-21 02:57:13

标签: go

如何在终端中隐藏用户输入(密码字段),类似于bash中-s中的read -s p "password " password命令。 ?

var password string
fmt.Println("password: ")
fmt.Scan(&password)

http://play.golang.org/p/xAPDDPjKb4

4 个答案:

答案 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))