Eu tenho o script bash como o seguinte:
#!/bin/bash
echo "Please enter your username";
read username;
echo "Please enter your password";
read password;
Quero que, quando o usuário digitar a senha no terminal, ela não seja exibida (ou algo como *******) seja exibido). Como faço para conseguir isso?
*
enquanto digita a senha.read
? e outros.Respostas:
Basta fornecer -s à sua chamada de leitura da seguinte forma:
fonte
-s
exibe nada enquanto a entrada é digitada. (-s
É uma extensão não-POSIX, nem todas as conchas apoiá-lo, como oash
shell que vem com o BusyBox; usar assty -echo
abordagem em tais conchas)man
verdade, nada na página sugere que-s
defina a cor do texto para a mesma cor de fundo. Apenas "ecoa silenciosamente". ss64.com/bash/read.htmlSilent mode. If input is coming from a terminal, characters are not echoed.
Atualizar
Caso você deseje ter uma fantasia, imprimindo um
*
para cada caractere digitado, você pode fazer algo assim (usando aread -s
solução de andreas ):Sem ser chique
fonte
IFS=$'\n'
por isso que você pode realmente terminar de digitar a senha. Caso contrário, agradável; muito esperto.IFS=$'\n'
porque o delimitador padrão da leitura é-d $'\n'
. A instrução if para quebrar uma string nul, que acontece em uma nova linha, é o que permite que eles terminem a senha.read
um-d ''
. Quando tentei novamente mais tarde no Linux, usei a versão republicada. Se eu tentar omitir-d ''
, é claro que funciona de forma idêntica no FreeBSD! Estou realmente bastante aliviado por não haver nenhuma mágica misteriosa de plataforma em ação aqui.para uma solução que funcione sem o bash ou com certos recursos,
read
você pode usarstty
para desativar o ecofonte
Aqui está uma variação da excelente
*
solução de impressão do @ SiegeX,bash
com suporte para backspace adicionado; isso permite que o usuário corrija sua entrada com abackspace
chave (delete
chave em um Mac) , como normalmente é suportado por solicitações de senha:Nota:
0x7f
: "Nos sistemas modernos, a tecla backspace é frequentemente mapeada para o caractere de exclusão (0x7f em ASCII ou Unicode)" https://en.wikipedia.org/wiki/Backspace\b \b
é necessário para dar a aparência de excluir o caractere para a esquerda; apenas usar\b
move o cursor para a esquerda, mas deixa o caractere intacto ( backspace não destrutivo ). Ao imprimir um espaço e voltar novamente, o caractere parece ter sido apagado (obrigado, o caractere de escape "backspace" '\ b' em C, comportamento inesperado? ).Em um shell somente POSIX (por exemplo,
sh
no Debian e Ubuntu, ondesh
estádash
), use astty -echo
abordagem (que é subótima, porque não imprime nada ), porque oread
builtin não suporta as opções-s
e-n
.fonte
Um pouco diferente da resposta de (mas principalmente como) @ lesmana
simplesmente: esconda eco, faça seu material mostre eco
fonte
stty
chamada e uma variável a menos na pilha - apenas retirando o eco e restaurando o eco. Existe alguma maneira possível de perturbar outrasstty
configurações? O Lesmana preserva todas as configurações.Aqui está uma variação da resposta do @ SiegeX que funciona com o shell Bourne tradicional (que não tem suporte para
+=
atribuições).fonte
[[ ... ]]
, nem seuread
built-in teria as opções-s
e-n
. Seu código, portanto, não funcionarádash
, por exemplo. (Ele vai trabalhar em plataformas ondesh
é, na verdadebash
, como no OSX, ondebash
, quando invocado comosh
meramente modifica algumas opções padrão e ainda dar suporte a maioria dos bashisms.)[
mas obviamente não posso fazer muito se o seuread
não possuir essas opções.Eu sempre gosto de usar caracteres de escape Ansi:
8m
torna o texto invisível e0m
redefine o texto para "normal". O -e torna possível a fuga de Ansi.A única ressalva é que você ainda pode copiar e colar o texto existente, portanto, provavelmente não deve usá-lo se realmente deseja segurança.
Ele apenas permite que as pessoas não vejam suas senhas quando você as digita. Apenas não deixe o computador ligado posteriormente. :)
NOTA:
O acima é independente da plataforma, desde que ele suporte sequências de escape do Ansi.
No entanto, para outra solução Unix, você pode simplesmente dizer
read
para não ecoar os caracteres ...fonte
fonte