【发布时间】:2018-04-07 06:08:48
【问题描述】:
所以我有一个从 STDIN 读取的 Go 程序,如下所示。我希望从键盘或设备输入用户名和密码,但可以使用管道传递字符串切片。如果我运行如下命令:
echo "Hello World" | go run main.go
os.Stdin 将被设置为从管道读取,而不是从键盘读取。有没有办法我可以更改os.Stdin FileMode 使其从设备读取,即用户名和密码的键盘?
我尝试使用os.Stdin.Chmod(FileMode),但收到此错误:
chmod /dev/stdin: 无效参数
func main() {
var n = []string{}
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("Please type anything with Newline Separated, empty line signals termination")
for scanner.Scan() {
h := scanner.Text()
if h == "" {
break
}
n = append(n, h)
}
if err := scanner.Err(); err != nil {
fmt.Printf("Error in reading from STDIN: %v\n", err)
}
reader := bufio.NewReader(os.Stdin)
os.Stdout.WriteString("Username: ")
username, err := reader.ReadString('\n')
if err != nil {
fmt.Printf("Unable to read username: %v\n", err)
}
username = strings.TrimSpace(username)
os.Stdout.WriteString("Password: ")
bytePassword, _ := terminal.ReadPassword(int(os.Stdin.Fd()))
password := string(bytePassword)
os.Stdout.WriteString("\n")
}
【问题讨论】:
-
澄清一下,目标是从标准输入读取,然后从终端读取,即使终端没有连接到标准输入?
-
目标是从程序开头设置为管道模式的stdin读取,从
reader := bufio.NewReader(os.Stdin)这一行开始,stdin的模式切换到设备,即键盘