Mam skrypt automatyzujący proces wymagający dostępu do systemu chronionego hasłem. Dostęp do systemu uzyskuje się za pomocą programu wiersza polecenia, który przyjmuje hasło użytkownika jako argument.
Chciałbym poprosić użytkownika o wpisanie hasła, przypisanie go do zmiennej powłoki, a następnie użycie tej zmiennej do skonstruowania wiersza polecenia programu uzyskującego dostęp (który oczywiście wygeneruje dane wyjściowe strumienia, które przetworzę).
Jestem dość kompetentnym programistą powłoki w Bourne / Bash, ale nie wiem, jak zaakceptować dane wejściowe użytkownika bez echa na terminalu (a może echa za pomocą znaków „*”).
Czy ktoś może w tym pomóc?
read
z-r
argumentem podczas czytania haseł. W przeciwnym razie ukośniki odwrotne mogą zostać utracone. Żadna z odpowiedzi nie wspomina o tym. Akceptowana odpowiedź na zduplikowane pytanie obejmuje to i kilka innych przypadków skrajnych. Np. UstawienieIFS=
, aby nie stracić końcowych spacji.Odpowiedzi:
Oto inny sposób, aby to zrobić:
read -s
Zgaśnie echo dla Ciebie. Po prostu zamień wecho
ostatnim wierszu na polecenie, które chcesz uruchomić.źródło
read
polecenia:read -s -p "Password:" password
read -s
nie ma go w POSIX, twój skrypt zależy od bash, jeśli go używasz. Jeśli chcesz być zgodny z POSIX, powinieneś zamiast tego użyćstty -echo
rozwiązania sugerowanego poniżej, ponieważstty
i jegoecho
parametry są zdefiniowane w POSIX.echo -n
nie ma też w POSIX. Użyjprintf
zamiast tego./bin/bash
a nie z/bin/sh
, tylko dla wyjaśnienia.echo "$REPLY" | sed -r 's/./*/g'
(lub nawet dowolnej liczby gwiazdek) zamiast pustych,echo
aby poinformować ich, że wprowadzono hasło (jeśli je wpisali. Mam hasło domyślne, jeśli zdecydują się pominąć monit w moim konkretnym przypadku skrypt)Odpowiedź zgodna z POSIX. Zwróć uwagę na użycie
/bin/sh
zamiast/bin/bash
. (Działa z bash, ale nie wymaga bash).źródło
stty
jeśli chcesz być zgodny z POSIX. Kod w tej odpowiedzi działa doskonale nawet nie w bash, ale w rzeczywistości na wszystkich powłokach zgodnych z POSIX.echo -n "Password: " && read -s password || { stty -echo; read password; stty echo; }
Jedna wkładka:
Pod Linuksem (i cygwin) ta forma działa w bash i sh. Jednak może to nie być standardowy uniksowy sh.
Aby uzyskać więcej informacji i opcji, w bash wpisz „help read”.
źródło
-s
Opcjaread
nie jest zdefiniowane w standardzie POSIX. Zobacz http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Chciałem czegoś, co działałoby dla dowolnej powłoki POSIX, więc napisałem małą funkcję, która używastty
do wyłączenia echa.Ta funkcja działa dość podobnie do
read
polecenia. Oto proste użycie,read
po którym następuje podobne użycieread_secret
. Dane wejścioweread_secret
wydają się puste, ponieważ nie zostały powtórzone echem na terminalu.Oto kolejna, która wykorzystuje
-r
opcję zachowania ukośników odwrotnych na wejściu. Działa to, ponieważread_secret
funkcja zdefiniowana powyżej przekazuje wszystkie otrzymane argumenty doread
polecenia.Wreszcie, oto przykład, który pokazuje, jak użyć
read_secret
funkcji do odczytania hasła w sposób zgodny z POSIX.źródło
oldtty = stty -g
a następnie na końcu,stty $oldtty
aby przywrócić poprzednie ustawienia. W przeciwnym razie jest świetnie.askpass
Polecenie okazało się przydatneKażdy znak wejściowy jest zastępowany przez *. Zobacz: Podaj hasło ****
źródło
/lib/cryptsetup/askpass
jest? Z pewnością nie jest to standardowe narzędzie * nix (lub GNU / Linux).sudo apt-get install cryptsetup
.Ctrl+C
to zepsuje terminal/lib/cryptsetup/askpass "Give a password" > pass.txt
Bardzo przydatne, dzięki!Wyłącz
echo
za pomocąstty
, a następnie włącz ponownie po.źródło
Możesz także poprosić o hasło bez ustawiania zmiennej w bieżącej powłoce, wykonując coś takiego:
Na przykład:
Możesz dodać kilka z tych wartości z podziałem wiersza, wykonując następujące czynności:
źródło
Każdy, kto potrzebuje pytania o hasło, może zainteresować się użyciem encpass.sh . Jest to skrypt, który napisałem do podobnych celów przechwytywania sekretu w czasie wykonywania, a następnie szyfrowania go przy kolejnych okazjach. Kolejne uruchomienia nie wymagają podania hasła, ponieważ po prostu użyje zaszyfrowanej wartości z dysku.
Przechowuje zaszyfrowane hasła w ukrytym folderze w katalogu osobistym użytkownika lub w folderze niestandardowym, który można zdefiniować za pomocą zmiennej środowiskowej ENCPASS_HOME_DIR. Został zaprojektowany zgodnie z POSIX i ma licencję MIT, dzięki czemu można go używać nawet w korporacyjnych środowiskach korporacyjnych. Moja firma, Plyint LLC , utrzymuje skrypt i od czasu do czasu wydaje aktualizacje. Żądania ściągania są również mile widziane, jeśli znajdziesz problem. :)
Aby użyć go w swoich skryptach, po prostu wpisz encpass.sh w swoim skrypcie i wywołaj funkcję get_secret. Załączam kopię skryptu poniżej dla ułatwienia widoczności.
źródło
Ten link pomaga w zdefiniowaniu: * Jak odczytać hasło z użycia bez echa z powrotem do terminala * Jak zamienić każdy znak na * -znak.
https://www.tutorialkart.com/bash-shell-scripting/bash-read-username-and-password/
źródło
Przede wszystkim, jeśli ktokolwiek zamierza przechowywać hasło w pliku, upewniłbym się, że jest ono zakodowane. Nie jest to najlepsze zabezpieczenie, ale przynajmniej nie będzie to zwykły tekst.
Najpierw utwórz hasło i hasz je:
Teraz stwórz swój program do używania skrótu. W tym przypadku ten mały program odbiera hasło użytkownika bez echa, a następnie konwertuje je na skrót, aby porównać go z zapisanym skrótem. Jeśli pasuje do przechowywanego skrótu, dostęp jest przyznawany:
źródło
\n
wynikającego zecho
polecenia z dala od mieszania, używającecho -n
zamiast tego, ponieważ\n
tak naprawdę nie jest częścią dostarczonego hasła - oczywiście zarówno w celu utworzenia, jak/tmp/secret
i porównania, które następuje w twoim przykładzie.