Eu tenho um script que automatiza um processo que precisa acessar um sistema protegido por senha. O sistema é acessado através de um programa de linha de comando que aceita a senha do usuário como argumento.
Gostaria de solicitar ao usuário que digite sua senha, atribua-a a uma variável do shell e, em seguida, use essa variável para construir a linha de comando do programa de acesso (que, é claro, produzirá a saída do fluxo que processarei).
Sou um programador de shell razoavelmente competente no Bourne / Bash, mas não sei como aceitar a entrada do usuário sem fazer eco no terminal (ou talvez fazer eco usando caracteres '*').
Alguém pode ajudar com isso?
read
o-r
argumento ao ler senhas. Caso contrário, as barras invertidas podem ser perdidas. Nenhuma das respostas menciona isso. A resposta aceita para a pergunta duplicada cobre esse e mais alguns casos extremos. Por exemplo, configuraçãoIFS=
para não perder espaços à direita.Respostas:
Aqui está outra maneira de fazer isso:
O
read -s
eco será desativado para você. Apenas substitua oecho
na última linha pelo comando que você deseja executar.fonte
read
comando:read -s -p "Password:" password
read -s
não está no POSIX, seu script depende do bash se você o usar. Se você deseja ser compatível com POSIX, deve usar astty -echo
solução sugerida abaixo, porquestty
e seusecho
parâmetros estão definidos no POSIX.echo -n
também não está no POSIX. Use emprintf
vez disso./bin/bash
e não com/bin/sh
, apenas para deixar isso claro.echo "$REPLY" | sed -r 's/./*/g'
(ou mesmo um número arbitrário de asteriscos) em vez de um vazioecho
para que eles saibam que sua entrada de senha foi vista (se eles digitarem um. Eu tenho uma senha padrão se eles optarem por ignorar o prompt no meu particular) script)Uma resposta compatível com POSIX. Observe o uso de em
/bin/sh
vez de/bin/bash
. (Ele funciona com o bash, mas não requer o bash.)fonte
stty
, se você quiser ser compatível com POSIX. O código nesta resposta funciona perfeitamente nem no bash, mas na verdade em todos os shells que estão em conformidade com o POSIX.echo -n "Password: " && read -s password || { stty -echo; read password; stty echo; }
Um forro:
No Linux (e cygwin), este formulário funciona em bash e sh. Porém, pode não ser o padrão Unix sh.
Para mais informações e opções, no bash, digite "help read".
fonte
A
-s
opção deread
não está definida no padrão POSIX. Consulte http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Eu queria algo que funcionasse para qualquer shell POSIX, então escrevi uma pequena função que usastty
para desativar o eco.Essa função se comporta de maneira bastante semelhante ao
read
comando. Aqui está um uso simples deread
seguido por um uso semelhante deread_secret
. A entrada pararead_secret
aparece vazia porque não foi ecoada no terminal.Aqui está outro que usa a
-r
opção para preservar as barras invertidas na entrada. Isso funciona porque aread_secret
função definida acima passa todos os argumentos que recebe para oread
comando.Finalmente, aqui está um exemplo que mostra como usar a
read_secret
função para ler uma senha de maneira compatível com POSIX.fonte
oldtty = stty -g
e, no final,stty $oldtty
para restaurar as configurações anteriores. Caso contrário, é ótimo.Eu achei o
askpass
comando útilCada caractere de entrada é substituído por *. Consulte: Dê uma senha ****
fonte
/lib/cryptsetup/askpass
? Certamente não é uma ferramenta padrão * nix (ou GNU / Linux).sudo apt-get install cryptsetup
.Ctrl+C
ele mexe-se o terminal/lib/cryptsetup/askpass "Give a password" > pass.txt
Muito útil, obrigado!Desligue
echo
usandostty
e ligue novamente depois.fonte
Você também pode solicitar uma senha sem definir uma variável no shell atual, fazendo algo assim:
Por exemplo:
Você pode adicionar vários desses valores solicitados com quebra de linha, fazendo o seguinte:
fonte
Para qualquer pessoa que precise solicitar uma senha, pode estar interessado em usar o encpass.sh . Este é um script que escrevi para fins semelhantes de capturar um segredo em tempo de execução e depois criptografá-lo para ocasiões subseqüentes. As execuções subsequentes não solicitam a senha, pois ela apenas usará o valor criptografado do disco.
Ele armazena as senhas criptografadas em uma pasta oculta no diretório inicial do usuário ou em uma pasta personalizada que você pode definir através da variável de ambiente ENCPASS_HOME_DIR. Ele foi projetado para ser compatível com POSIX e possui uma licença MIT, para que possa ser usado mesmo em ambientes corporativos corporativos. Minha empresa, Plyint LLC , mantém o script e ocasionalmente lança atualizações. Solicitações pull também são bem-vindas, se você encontrar um problema. :)
Para usá-lo em seus scripts, simplesmente encode o arquivo encpass.sh no seu script e chame a função get_secret. Estou incluindo uma cópia do script abaixo para facilitar a visibilidade.
fonte
Este link é útil para definir * Como ler a senha do uso sem repeti-la no terminal * Como substituir cada caractere pelo caractere *.
https://www.tutorialkart.com/bash-shell-scripting/bash-read-username-and-password/
fonte
Primeiro de tudo, se alguém quiser armazenar qualquer senha em um arquivo, eu me certificaria de que esteja com hash. Não é a melhor segurança, mas pelo menos não estará em texto simples.
Primeiro, crie a senha e faça o hash:
Agora, crie seu programa para usar o hash. Nesse caso, este pequeno programa recebe entrada do usuário para uma senha sem eco e, em seguida, converte-a em hash para ser comparada com o hash armazenado. Se corresponder ao hash armazenado, o acesso será concedido:
fonte
\n
resultante doecho
comando longe do hash usandoecho -n
, pois\n
não é realmente parte da senha fornecida - é claro, tanto para a criação quanto para/tmp/secret
a comparação que se segue no seu exemplo.