функциональность getpasswd в Движении?

Ситуация:

Я хочу получить ввод пароля от stdin консоль - не повторяя то, что вводит пользователь. Есть ли что-то сопоставимое с getpasswd функциональность в Движении?

Что я попробовал:

Я пытался использовать syscall.Read, но это повторяет то, что вводится.

47
задан Rene Knop 11 November 2018 в 04:07
поделиться

3 ответа

Вы можете сделать это, выполнив stty -echo , чтобы отключить эхо, а затем STTY ECHO после прочтения пароля, чтобы включить его Вернуться на

7
ответ дан 26 November 2019 в 19:22
поделиться

Вы можете получить желаемое поведение с методом чтения из объекта 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.

-4
ответ дан 26 November 2019 в 19:22
поделиться

Требуется запуск 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
}
1
ответ дан 26 November 2019 в 19:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: