在Go中管道命令时从控制台读取

时间:2017-10-23 06:19:05

标签: shell go command-line

我需要一种从控制台读取输入两次的方法(1 - 从cat outupt,2 - 用户输入密码),如下所示: cat ./test_data/test.txt | app account import

我当前的代码跳过密码输入:

reader := bufio.NewReader(os.Stdin)
raw, err := ioutil.ReadAll(reader)
if err != nil {
    return cli.NewExitError(err.Error(), 1)
}

wlt, err := wallet.Deserialize(string(raw))
if err != nil {
    return cli.NewExitError(err.Error(), 1)
}

fmt.Print("Enter password: ")
pass := ""
fmt.Fscanln(reader, &pass)

还尝试使用Scanln读取密码 - 不起作用。

注意cat(和管道都可以)不能与用户输入一起使用,因为shell会完全重定向输入。 所以最简单的解决方案是:

  • 将filename作为参数传递

  • 重定向手动应用帐户导入< ./test.txt

1 个答案:

答案 0 :(得分:1)

分别读取文件和密码(并且不显示密码),试试这个:

package main

import (
    "fmt"
    "io/ioutil"
    "log"

    "github.com/howeyc/gopass"
)

func main() {
    b, err := ioutil.ReadFile("./test_data/test.txt") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }
    fmt.Println(string(b))

    fmt.Print("Password: ")
    pass, err := gopass.GetPasswd()
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Println(string(pass))
}
首先是

go get github.com/howeyc/gopass