Como tomar 'password' como entrada no shell script? [duplicado]

14

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.

Comportamento esperado

$./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?

    
por mtk 09.12.2012 / 18:50

3 respostas

22

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 .

    
por 09.12.2012 / 19:00
4

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;
}
    
por 09.12.2012 / 20:04
2

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
    
por 09.12.2012 / 20:28