Como faço para ecoar estrelas (*) ao ler a senha com `read`?

O que eu preciso fazer para o código no Bash, se eu quiser echo * s no lugar de caracteres de senha (ou até mesmo ocultar os caracteres completamente) quando o usuário digita algo em usar a read ?

Como Mark Rushakoff apontou, read -s suprimirá o eco dos caracteres typescripts no prompt. Você pode usar esse recurso como parte desse script para fazer o eco dos asteriscos de cada caractere typescript:

 #!/bin/bash unset password prompt="Enter Password:" while IFS= read -p "$prompt" -r -s -n 1 char do if [[ $char == $'\0' ]] then break fi prompt='*' password+="$char" done echo echo "Done. Password=$password" 

Eu realmente gostei da resposta que Wirone deu, mas eu não gostei que o backspacing continuasse removendo os caracteres até mesmo no prompt “Enter password:”.

Eu também tive alguns problemas em que pressionar as teclas muito rapidamente faria com que alguns dos personagens realmente imprimissem na canvas … nunca é uma boa coisa quando solicitando uma senha. =)

A seguir, minha versão modificada da resposta de Wirone , que trata desses problemas:

 #!/bin/bash unset PASSWORD unset CHARCOUNT echo -n "Enter password: " stty -echo CHARCOUNT=0 while IFS= read -p "$PROMPT" -r -s -n 1 CHAR do # Enter - accept password if [[ $CHAR == $'\0' ]] ; then break fi # Backspace if [[ $CHAR == $'\177' ]] ; then if [ $CHARCOUNT -gt 0 ] ; then CHARCOUNT=$((CHARCOUNT-1)) PROMPT=$'\b \b' PASSWORD="${PASSWORD%?}" else PROMPT='' fi else CHARCOUNT=$((CHARCOUNT+1)) PROMPT='*' PASSWORD+="$CHAR" fi done stty echo echo $PASSWORD 

read -s deve colocá-lo no modo silencioso:

 -s Silent mode. If input is coming from a terminal, characters are not echoed. 

Veja a seção de read em man bash .

Eu não sei sobre estrelas, mas stty -echo é seu amigo:

  #!/bin/sh read -p "Username: " uname stty -echo read -p "Password: " passw; echo stty echo 

Fonte: http://www.peterbe.com/plog/passwords-with-bash

Eu gostaria de acrescentar algo à solução de Dennis Williamson :

 #!/bin/bash unset password echo -n "Enter password: " while IFS= read -p "$prompt" -r -s -n 1 char do # Enter - accept password if [[ $char == $'\0' ]] ; then break fi # Backspace if [[ $char == $'\177' ]] ; then prompt=$'\b \b' password="${password%?}" else prompt='*' password+="$char" fi done 

No exemplo acima, o script manipula o backspace corretamente.

Fonte

 stty -echo read something stty echo 

irá parar a input do usuário sendo ecoado na canvas para aquela leitura. Dependendo do que você está fazendo com prompts, você pode querer adicionar um comando extra echo para gerar uma nova linha após a leitura.

Se você não se importa em ser interativo, você pode simplesmente fazer

 read -s pass echo "$pass" | sed 's/./*/g' 

Isso mostrará um * para cada caractere da senha digitada após a digitação ser pressionada.

Eu acabei de fazer essa function específica do Bash baseada nas respostas de Dennis Williamson , Wirone e Logan VanCuren :

 ask() { local 'args' 'char' 'charcount' 'prompt' 'reply' 'silent' # Basic arguments parsing while [[ "${1++}" ]]; do case "${1}" in ( '--silent' | '-s' ) silent='yes' ;; ( '--' ) args+=( "${@:2}" ) break ;; ( * ) args+=( "${1}" ) ;; esac shift || break done if [[ "${silent}" == 'yes' ]]; then for prompt in "${args[@]}"; do charcount='0' prompt="${prompt}: " reply='' while IFS='' read -n '1' -p "${prompt}" -r -s 'char'; do case "${char}" in # Handles NULL ( $'\000' ) break ;; # Handles BACKSPACE and DELETE ( $'\010' | $'\177' ) if (( charcount > 0 )); then prompt=$'\b \b' reply="${reply%?}" (( charcount-- )) else prompt='' fi ;; ( * ) prompt='*' reply+="${char}" (( charcount++ )) ;; esac done printf '\n' >&2 printf '%s\n' "${reply}" done else for prompt in "${args[@]}"; do IFS='' read -p "${prompt}: " -r 'reply' printf '%s\n' "${reply}" done fi } 

Pode ser usado como:

 $ ask Username Username: AzureDiamond AzureDiamond $ ask -s Password Password: ******* hunter2 $ ask First Second Third First: foo foo Second: bar bar Third: baz baz 
 #!/bin/bash echo "------------------------------" n=7 echo " Enter Password :" for (( i=1;i