【问题标题】:Silence user input in Scan function在扫描功能中静音用户输入
【发布时间】:2015-05-21 02:57:12
【问题描述】:

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

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

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

【问题讨论】:

标签: go


【解决方案1】:

最好的方法是使用终端包中的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))
 }
}

【讨论】:

  • 在 linux 下运行良好,有关于 windows 提示符的提示吗?
【解决方案2】:

我不知道go,所以我不确定你是否可以调用其他程序。如果是这样,只需调用 stty -echo 隐藏输入并调用 stty echo 再次显示它。

否则您可以尝试以下方法:

fmt.Println("password: ")
fmt.Println("\033[8m") // Hide input
fmt.Scan(&password)
fmt.Println("\033[28m") // Show input

【讨论】:

    【解决方案3】:

    要支持windows,如here所述,请使用:

    import "syscall"
    import "golang.org/x/crypto/ssh/terminal"
    
    passwd, err := terminal.ReadPassword(int(syscall.Stdin))
    

    【讨论】:

      【解决方案4】:

      我为此尝试了几种不同的方法并发现了问题(例如,如果正在等待密码,则 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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        相关资源
        最近更新 更多