Shell 在Go中传输命令时从控制台读取
我需要一种从控制台读取两次输入的方法(1-从Shell 在Go中传输命令时从控制台读取,shell,go,command-line,Shell,Go,Command Line,我需要一种从控制台读取两次输入的方法(1-从catoutupt,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.De
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
。是的,我已经使用terminal.ReadPassword(0)
来隐藏密码。但我需要在shell管道中使用我的应用程序的选项OK,所以你们需要从std中读取,那个么你们如何将文件数据和密码分开呢?这是一个输入流,不是吗?当从一个流中读取数据时,您需要检测第一个数据结束和第二个数据开始,这意味着同步头。可能是您编写了第二个程序,如cat
,它从一个文件中读取,并从std-in请求密码,然后使用格式化帧和sync将输出发送到std-out。我希望这有帮助。如果你正在从终端读取密码,看起来一切都正常。你们还有问题吗?我忘了,在管道传输过程中,并没有办法中断stdin从键盘输入密码。因此,可能的选项只是使用文件名