Ситуация:
Я хочу получить ввод пароля от stdin
консоль - не повторяя то, что вводит пользователь. Есть ли что-то сопоставимое с getpasswd
функциональность в Движении?
Что я попробовал:
Я пытался использовать syscall.Read
, но это повторяет то, что вводится.
Вы можете сделать это, выполнив stty -echo
, чтобы отключить эхо, а затем STTY ECHO
после прочтения пароля, чтобы включить его Вернуться на
Вы можете получить желаемое поведение с методом чтения из объекта OS.FILE (или переменной OS.Stdin). Следующая образец программы будет прочитать строку текста (прекращена, нажав кнопку возврата), но не будем повториться до вызова FMT.Printf.
package main
import "fmt"
import "os"
func main() {
var input []byte = make( []byte, 100 );
os.Stdin.Read( input );
fmt.Printf( "%s", input );
}
Если вы хотите более продвинутое поведение, вам, вероятно, придется использовать утилиты Go C-Wrapper и создавать некоторые обертки для низкоуровневых вызовов API.
Требуется запуск STTY через Go Forkexec () Функция:
package main
import (
os "os"
bufio "bufio"
fmt "fmt"
str "strings"
)
func main() {
fmt.Println();
if passwd, err := Getpasswd("Enter password: "); err == nil {
fmt.Printf("\n\nPassword: '%s'\n",passwd)
}
}
func Getpasswd(prompt string) (passwd string, err os.Error) {
fmt.Print(prompt);
const stty_arg0 = "/bin/stty";
stty_argv_e_off := []string{"stty","-echo"};
stty_argv_e_on := []string{"stty","echo"};
const exec_cwdir = "";
fd := []*os.File{os.Stdin,os.Stdout,os.Stderr};
pid, err := os.ForkExec(stty_arg0,stty_argv_e_off,nil,exec_cwdir,fd);
if err != nil {
return passwd, os.NewError(fmt.Sprintf("Failed turning off console echo for password entry:\n\t%s",err))
}
rd := bufio.NewReader(os.Stdin);
os.Wait(pid,0);
line, err := rd.ReadString('\n');
if err == nil {
passwd = str.TrimSpace(line)
} else {
err = os.NewError(fmt.Sprintf("Failed during password entry: %s",err))
}
pid, e := os.ForkExec(stty_arg0,stty_argv_e_on,nil,exec_cwdir,fd);
if e == nil {
os.Wait(pid,0)
} else if err == nil {
err = os.NewError(fmt.Sprintf("Failed turning on console echo post password entry:\n\t%s",e))
}
return passwd, err
}