Come ottenere una password da uno script di shell senza eco

Ho uno script che automatizza un processo che richiede l’accesso a un sistema protetto da password. Si accede al sistema tramite un programma della riga di comando che accetta la password dell’utente come argomento.

Vorrei chiedere all’utente di digitare la sua password, assegnarla a una variabile di shell e quindi usare quella variabile per build la riga di comando del programma di accesso (che ovviamente produrrà output di stream che elaborerò).

Sono un programmatore di shell ragionevolmente competente in Bourne / Bash, ma non so come accettare l’input dell’utente senza averlo fatto eco al terminale (o forse averlo fatto eco usando caratteri ‘*’).

Qualcuno può aiutare con questo?

Ecco un altro modo per farlo:

#!/bin/bash # Read Password echo -n Password: read -s password echo # Run Command echo $password 

Le read -s disattiveranno l’eco per te. Basta sostituire l’ echo sull’ultima riga con il comando che vuoi eseguire.

 #!/bin/bash stty -echo printf "Password: " read PASSWORD stty echo printf "\n" 

Una fodera:

 read -s -p "Password: " password 

Sotto Linux (e cygwin) questo modulo funziona in bash e sh. Tuttavia, potrebbe non essere standard Unix sh.

Per ulteriori informazioni e opzioni, in bash, digita “help read”.

 $ help read read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] Read a line from the standard input and split it into fields. ... -p prompt output the string PROMPT without a trailing newline before attempting to read ... -s do not echo input coming from a terminal 

L’opzione -s di read non è definita nello standard POSIX. Vedi http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Volevo qualcosa che potesse funzionare per qualsiasi shell POSIX, quindi ho scritto una piccola funzione che usa stty per disabilitare l’eco.

 #!/bin/sh # Read secret string read_secret() { # Disable echo. stty -echo # Set up trap to ensure echo is enabled before exiting if the script # is terminated while echo is disabled. trap 'stty echo' EXIT # Read secret. read "[email protected]" # Enable echo. stty echo trap - EXIT # Print a newline because the newline entered by the user after # entering the passcode is not echoed. This ensures that the # next line of output begins at a new line. echo } 

Questa funzione si comporta in modo abbastanza simile al comando di read . Ecco un semplice uso di read seguito da un uso simile di read_secret . L’input di read_secret sembra vuoto perché non è stato echeggiato nel terminale.

 [[email protected] ~]$ read abc foo \bar baz \qux [[email protected] ~]$ echo a=$ab=$bc=$c a=foo b=bar c=baz qux [[email protected] ~]$ unset abc [[email protected] ~]$ read_secret abc [[email protected] ~]$ echo a=$ab=$bc=$c a=foo b=bar c=baz qux [[email protected] ~]$ unset abc 

Ecco un altro che usa l’opzione -r per preservare i backslash nell’input. Questo funziona perché la funzione read_secret sopra definita passa tutti gli argomenti che riceve al comando di read .

 [[email protected] ~]$ read -rabc foo \bar baz \qux [[email protected] ~]$ echo a=$ab=$bc=$c a=foo b=\bar c=baz \qux [[email protected] ~]$ unset abc [[email protected] ~]$ read_secret -rabc [[email protected] ~]$ echo a=$ab=$bc=$c a=foo b=\bar c=baz \qux [[email protected] ~]$ unset abc 

Infine, ecco un esempio che mostra come utilizzare la funzione read_secret per leggere una password in un modo conforms a POSIX.

 printf "Password: " read_secret password # Do something with $password here ... 

Ho trovato utile il comando askpass

 password=$(/lib/cryptsetup/askpass "Give a password") 

Ogni carattere inserito viene sostituito da *. Vedi: dare una password ****

Distriggers l’ echo usando stty , quindi riaccendilo dopo.

Prima di tutto se qualcuno sta per memorizzare qualsiasi password in un file. Mi sarei assicurato che fosse un hash. Non è la migliore sicurezza, ma almeno non sarà in chiaro.

  1. Prima crea la password e cancellala:

    echo “password123” | md5sum | cut -d ‘-‘ -f 1> / tmp / secret

  2. Ora crea il tuo programma per usare l’hash, in questo caso questo piccolo programma riceve l’input dell’utente per una password senza eco e poi lo converte in hash per essere confrontato con l’hash memorizzato. Se corrisponde all’hash memorizzato, l’accesso è garantito:

    #! / Bin / bash

     PASSWORD_FILE="/tmp/secret" MD5_HASH=$(cat /tmp/secret) PASSWORD_WRONG=1 while [ $PASSWORD_WRONG -eq 1 ] do echo "Enter your password:" read -s ENTERED_PASSWORD if [ "$MD5_HASH" != "$(echo $ENTERED_PASSWORD | md5sum | cut -d '-' -f 1)" ]; then echo "Access Deniend: Incorrenct password!. Try again" else echo "Access Granted" PASSWORD_WRONG=0 fi done