Mam skrypt basha podobny do następującego:
#!/bin/bash
echo "Please enter your username";
read username;
echo "Please enter your password";
read password;
Chcę, aby kiedy użytkownik wpisze hasło na terminalu, nie powinno ono być wyświetlane (lub powinno być wyświetlane coś takiego jak *******)). Jak to osiągnąć?
*
podczas wpisywania hasłaread
? i inni.Odpowiedzi:
Po prostu podaj-do twojego wywołania odczytu w następujący sposób:
źródło
-s
wyświetla podczas wpisywania danych wejściowych. ( jest rozszerzeniem innym niż POSIX, więc nie wszystkie powłoki je obsługują, na przykład powłoka dostarczana z BusyBox; użyj podejścia w takich powłokach)-s
ash
ssty -echo
man
rzeczywistości nic na stronie nie sugeruje, że-s
ustawia kolor tekstu na taki sam, jak kolor tła. Po prostu „odbija się cichym echem”. ss64.com/bash/read.htmlSilent mode. If input is coming from a terminal, characters are not echoed.
Aktualizacja
Jeśli chcesz uzyskać fantazyjność, wyświetlając
*
znak dla każdego wpisanego znaku, możesz zrobić coś takiego (używającread -s
rozwiązania Andreasa ):Bez bycia wyszukanym
źródło
IFS=$'\n'
tak, aby można było faktycznie dokończyć wpisywanie hasła. Poza tym miło; bardzo mądry.IFS=$'\n'
ponieważ domyślnym separatorem odczytu jest-d $'\n'
. Instrukcja if, która przerywa ciąg znaków o wartości nul, co dzieje się w nowej linii, umożliwia dokończenie hasła.read
-d ''
-d ''
aby znaleźć rozwiązanie, które działa bez basha lub niektórych funkcji
read
, możesz użyćstty
do wyłączenia echaźródło
Oto wariacja na temat doskonałego
*
rozwiązania drukowania @ SiegeX dlabash
z dodaną obsługą backspace ; umożliwia to użytkownikowi poprawienie wpisu za pomocąbackspace
klucza (delete
klucz na komputerze Mac) , co jest zwykle obsługiwane przez monity o hasło:Uwaga:
0x7f
: „W nowoczesnych systemach klawisz Backspace jest często odwzorowywany na znak usuwania (0x7f w ASCII lub Unicode)” https://en.wikipedia.org/wiki/Backspace\b \b
jest potrzebny, aby nadać pozór usuwania znaku po lewej stronie; samo użycie\b
przesuwa kursor w lewo, ale pozostawia znak nienaruszony ( nieniszczący backspace). Po wydrukowaniu spacji i ponownym cofnięciu się, znak wydaje się być usunięty (dzięki, znak ucieczki „backspace” „\ b” w C, nieoczekiwane zachowanie? ).W powłoce obsługującej tylko POSIX (np. W
sh
Debianie i Ubuntu, gdziesh
jestdash
), użyj tegostty -echo
podejścia (które jest nieoptymalne, ponieważ nic nie drukuje ), ponieważread
wbudowana funkcja nie obsługuje opcji-s
i-n
.źródło
Trochę różni się od odpowiedzi @ lesmana (ale głównie podoba)
po prostu: ukryj echo zrób swoje rzeczy pokaż echo
źródło
stty
wywołanie i jedną mniejszą zmienną na stosie - tylko zabierając echo i tylko przywracając echo. Czy istnieje sposób, w jaki mogłoby to zakłócić innestty
ustawienia? Lesmana zachowuje wszystkie ustawienia.Oto odmiana odpowiedzi @ SiegeX, która działa z tradycyjną powłoką Bourne'a (która nie obsługuje
+=
przypisań).źródło
[[ ... ]]
, ani też jejread
wbudowana powłoka nie miałaby opcji-s
i-n
. Twój kod nie będzie więc działałdash
na przykład w. (Będzie działać na platformach, na którychsh
faktycznie jestbash
, na przykład na OSX, gdziebash
po wywołaniush
tylko modyfikuje kilka domyślnych opcji, jednocześnie nadal obsługując większość bashizmów.)[
ale oczywiście niewiele mogę zrobić, jeśliread
nie masz tych opcji.Zawsze lubię używać znaków ucieczki Ansi:
8m
sprawia, że tekst jest niewidoczny i0m
resetuje tekst do „normalnego”. -E umożliwia Ansi ucieczkę.Jedynym zastrzeżeniem jest to, że nadal możesz skopiować i wkleić tekst, który tam jest, więc prawdopodobnie nie powinieneś tego używać, jeśli naprawdę chcesz bezpieczeństwa.
Po prostu pozwala ludziom nie patrzeć na Twoje hasła podczas ich wpisywania. Po prostu nie zostawiaj komputera włączonego później. :)
UWAGA:
Powyższe jest niezależne od platformy, o ile obsługuje sekwencje ucieczki Ansi.
Jednak w przypadku innego rozwiązania uniksowego możesz po prostu powiedzieć,
read
aby nie powtarzać znaków ...źródło
źródło