Se você usar sh
(ou bash
), use read
com a opção -s
(segura).
read -s pass
lerá a senha do usuário, não a mostrando para a saída e armazenará a variável pass
.
Eu gostaria de ter uma senha como entrada, mas quero que o usuário possa inseri-la como outros utilitários tratam, ou seja, os caracteres não aparecem na tela. Eu tentei pesquisar sobre isso, mas não encontrei resposta exata.
Eu preciso de uma variável e, em seguida, eu iria corresponder a entrada com uma variável pré-definida autônoma senha codificada de um dos arquivos de configuração no início do script.
$./startScript
username: mtk
password: ********
*
mostrado como marcadores de posição. Eu preciso que esta parte seja invisível. Atualmente, a senha é exibida quando o usuário a digita.
Como fazer isso?
Se você usar sh
(ou bash
), use read
com a opção -s
(segura).
read -s pass
lerá a senha do usuário, não a mostrando para a saída e armazenará a variável pass
.
O UNIX tem a função 'getpass' C para exibir um prompt e ler a senha com o eco desativado.
A função obtém a string de prompt e retorna um ponteiro para a string terminada em NULL contendo a senha. Não se esqueça do tamanho máximo das senhas (dê uma olhada em limits.h no seu sistema por PASS_MAX ou mais).
Observe também que 'getpass' coloca a senha no buffer estático interno, que é apagado toda vez que você o invoca. Assim, o processo decente deve zerar o buffer o mais rápido possível.
Aqui está um pequeno programa, mostrando o comportamento:
#include <stdio.h>
#include <unistd.h>
int
main( int argc, char** argv ) {
char* password = getpass( "Password: " );
printf( "Your password is: '%s'\n", password );
return 0;
}
Acho que esse código deve fazer o que você deseja:
#!/bin/bash
unset username
unset password
echo -n "username:"
read username
prompt="password:"
while IFS= read -p "$prompt" -r -s -n 1 char
do
if [[ $char == $'#!/bin/bash
unset username
unset password
echo -n "username:"
read username
prompt="password:"
while IFS= read -p "$prompt" -r -s -n 1 char
do
if [[ $char == $'%pre%' ]]
then
break
fi
prompt='*'
password+="$char"
done
' ]]
then
break
fi
prompt='*'
password+="$char"
done