shell - 在 Go 中通过管道命令从控制台读取

标签 shell go command-line

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

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

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 会完全重定向输入。 所以最简单的解决方案是:

  • 将文件名作为参数传递

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

最佳答案

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

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))
}

首先访问github.com/howeyc/gopass

关于shell - 在 Go 中通过管道命令从控制台读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46883050/

相关文章:

go - 确定为什么每行都出现在go.sum中

windows - 带循环的批处理(将所有文件复制到文件夹)

bash - 在 sed 命令中使用命令行参数

xml - 用于更改 xml 元素的 shell 脚本

linux - 如何使用 Bash/Shell 编程更改文本行?

linux - 是否可以编写一个在 bash/shell 和 PowerShell 中运行的脚本?

shell - bmon : No working input module found

linux - 我用 0 初始化数组时做错了什么?

linux - 在 jenkins 管道上使用容器运行 go2xunit

c - 调用Windows API函数(stdcall)的符号扩展规则是什么?这是从 Go 调用 WInAPI 所必需的,它对 int 类型很严格