Leggere le password senza mostrarle sullo schermo negli script Bash


20

Come leggere le password negli script bash in un modo simile a strumenti che non le mostrano sul terminale?

(La modifica del carattere in nero su nero potrebbe essere difficile da copiare e incollare, quindi non è una soluzione)


3
Per chiunque legga questo: NON leggere le password con echo on e black-on-black. La password viene comunque trasmessa e se il terminale non conosce le direttive del terminale che hai usato, i caratteri echeggeranno visibilmente. Disattiva l'eco. Usa termios, stty, read -s, tutto ciò che fa.
Alessio,

Ecco perché ho scritto che non è una soluzione;).
Grzegorz Wierzowiecki,

Infatti! A volte le persone sfogliano le domande e giungono a conclusioni errate. :)
Alexios,

Risposte:


30

Da help read:

-s        do not echo input coming from a terminal

1
Grande. Non è scritto nel mio man read, non ho effettuato il check-in help read. Buono a sapersi.
Grzegorz Wierzowiecki,

3
@GrzegorzWierzowiecki: stai visualizzando il manuale sbagliato. devi leggere il manuale di bash ie man bashe lì puoi trovare l'opzione -sSilent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri

5

Ho sempre usato stty -echoper disattivare l'eco, quindi leggere e poi fare stty echo(leggi di più visualizzando man of stty- ie man stty). Questo è più utile dal punto di vista dei programmatori poiché è possibile disattivare l'eco e quindi leggere una password da un linguaggio di programmazione come Java, C (++), Python, ecc. Con i loro "lettori" standard stdin.

In bash, l'uso potrebbe apparire così:

echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; stty -echo; read passwd; stty echo; echo
program $uname $passwd
passwd= # get rid of passwd

Python, ad esempio, sarebbe simile a:

from sys import stdout
from os import system as term

uname = raw_input("USERNAME: ") # read input from stdin until [Enter] in 2
stdout.write("PASSWORD: ")
term("stty -echo") # turn echo off
try:
    passwd = raw_input()
except KeyboardInterrupt: # ctrl+c pressed
    raise SystemExit("Password attempt interrupted")
except EOFError: # ctrl+d pressed
    raise SystemExit("Password attempt interrupted")
finally:
    term("stty echo") # turn echo on again

print "username:", uname
print "password:", "*" * len(passwd)

Ho dovuto farlo molte volte in Python, quindi lo conosco abbastanza bene da quella prospettiva. Questo non è molto difficile da tradurre in altre lingue, però.


-1

La tua domanda dice una specie di "in un modo simile agli strumenti ???" quindi non so esattamente se questo funzionerà per te:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.