Czytanie haseł bez pokazywania ich na ekranie w skryptach Bash

20

Jak czytać hasła w skryptach bash w sposób podobny do narzędzi, które nie wyświetlają ich na terminalu?

(Zmiana czcionki na czarną na czarną może być trudna dzięki łatwemu kopiowaniu i wklejaniu - więc nie jest to rozwiązanie)

Grzegorz Wierzowiecki
źródło
3
Dla każdego, kto to czyta: NIE czytaj w hasłach z włączonym echo i czarno na czarnym. Hasło jest nadal przesyłane, a jeśli terminal nie zna użytych dyrektyw terminalu, znaki będą widoczne w echu. Wyłącz echo. Zastosowanie termios, stty, read -swszystko, co robi.
Alexios
Dlatego napisałem, że to nie jest rozwiązanie;).
Grzegorz Wierzowiecki
W rzeczy samej! Czasami ludzie przeglądają pytania i dochodzą do błędnych wniosków. :)
Alexios

Odpowiedzi:

30

Od help read:

-s        do not echo input coming from a terminal
Ignacio Vazquez-Abrams
źródło
1
Świetny. Nie ma tego napisane man read, nie zameldowałem się help read. Dobrze wiedzieć.
Grzegorz Wierzowiecki
3
@GrzegorzWierzowiecki: Oglądasz niewłaściwy podręcznik. musisz przeczytać instrukcję bash tj. man bashi tam możesz znaleźć opcję -sSilent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri
5

Zawsze stty -echowyłączałem echo, a potem czytałem, a potem robiłem stty echo(czytaj więcej, oglądając człowieka stty- tj man stty.). Jest to bardziej przydatne z perspektywy programistów, ponieważ można wyłączyć echo, a następnie odczytać hasło z języka programowania, takiego jak Java, C (++), Python itp., Za pomocą standardowych „czytników” standardowego wejścia.

W bash użycie może wyglądać następująco:

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

Na przykład Python wyglądałby następująco:

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)

Musiałem to robić wiele razy w Pythonie, więc wiem to całkiem dobrze z tej perspektywy. Jednak nie jest to trudne do przetłumaczenia na inne języki.

Dylan
źródło
-1

Twoje pytanie brzmi inaczej „w sposób podobny do narzędzi ???” więc nie wiem dokładnie, czy to zadziała dla Ciebie:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
2bc
źródło