Usuń wprowadzone hasło w pytaniu o ukryte hasło (Linux) za pomocą skrótu

106

Czy istnieje sposób na usunięcie wszystkich znaków, które wprowadziłem w ukrytym pytaniu o hasło w systemie Linux? Na przykład, gdy przesyłam SSH do serwera, prosi o podanie hasła, w którym nie są wyświetlane wprowadzone klucze:

$ ssh root@somehost
root@somehost's password:

Czy istnieje sposób na usunięcie całego wprowadzonego tekstu bez konieczności naciskania klawisza Backspace przez nieznany czas? Kiedy wydaje mi się, że popełniłem błąd, chcę zacząć od nowa, a naciskanie klawisza Backspace na kilka sekund jest denerwujące. Próbowałem Esc, CtrlAmam nadzieję, zaznaczyć cały tekst i Home. CtrlCanuluje całe polecenie i muszę ponownie wysłać polecenie, aby spróbować ponownie. To prawie najlepsze i najszybsze rozwiązanie, ale wciąż niezadowalające. Wstaw też nie działa w mojej powłoce.

bugybunny
źródło
7
Jeśli chodzi o Ctrl + A, w terminalu zwykle oznacza to „przejdź do początku linii”. Zestaw kluczy używanych w terminalu (szczególnie bash) jest często bliższy Emacsowi niż Windowsowi.
Score_Under
18
Sshing jako root jest ogólnie uważany za bardzo bardzo złą praktykę.
Sam
Aby usunąć znaki z ekranu, musisz użyć sekwencji sterujących kursorem (jeśli terminal je obsługuje). Uruchamiając sshze skryptu, możesz przeanalizować ciąg parametrów przed jego uruchomieniem.
AFH
4
Proszę zwrócić uwagę na to, co powiedział @Sam. Powinieneś wyłączyć logowanie roota wszędzie. Zaloguj się jako zwykły użytkownik przy użyciu skomplikowanego hasła, a następnie suroot. Następnym krokiem jest wyłączenie schematów uwierzytelniania opartych na hasłach w SSH i użycie kluczy do logowania.
kostix
@kostix Jestem pewien, że wyłączenie haseł powinno być pierwszym krokiem. Jeśli używasz haseł, a następnie z su i wyłączonym rootem, wystarczy wprowadzić hasło, które atakujący odgadł już drugi raz po zalogowaniu, więc zyskujesz tylko, jeśli nazwa użytkownika jest trudna do odgadnięcia (co często nie jest zakładam bez statystyk). I bez logowania hasłem dodaje drugi sekret, hasło, ale jest to mniej warte niż klucz prywatny, który jest dłuższym sekretem.
Nikt

Odpowiedzi:

163

Możesz usunąć całe wpisane hasło za pomocą Ctrl+ U.

Ipor Sircer
źródło
6
Działa to również w regularnym monitie terminala!
MoonRunestar
35
Dla porównania jest to domyślne wiązanie klawiszy w „trybie emacsa” readline dla unix-line-discard, opisanym jako „Zabij wstecz od kursora do początku bieżącej linii”. Ref: cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC17 readline GNU to biblioteka wejściowa używana przez większość powłok i wiele innych programów interaktywnych (ale nie jest wbudowana w tty, więc to nie będzie praca wszędzie ).
IMSoP,
22
@IMSoP Jednak samo Ctrl-U jest wbudowane w tty (jako domyślny znak stty killfunkcji), dlatego działa z pytaniem o hasło ssh.
Random832,
5
BTW, Ctrl + K jest odpowiednikiem usuwania od kursora do końca linii.
wjandrea,
2
@DennisJaheruddin: To nie jest możliwe, ssh nie używa readline do edycji linii. Zobacz moją odpowiedź.
Peter Cordes,
14

W przeciwieństwie bash, sshjest prośba o podanie hasła nie korzysta z żadnego specjalnego terminala wejściowego biblioteki podobnego readline. Funkcje edycji linii to tylko podstawowe funkcje edycji linii POSIX TTY.

Masz więc POSIX TTY w trybie „gotowanym” (nie surowym), znanym również jako tryb kanoniczny, a jedyną dostępną edycją linii jest to, co zapewnia jądro. Zobacz stty(1)i zauważ to
kill = ^U. Tutaj również definiowany jest znak backspace ( erase = ^?). Usuwanie słów ( ^W) jest wygodne, gdy nie piszesz w ciemno.

lnext = ^V oznacza, że ​​możesz wpisać control-v, a następnie cokolwiek (w tym control-c), aby uzyskać literalną kontrolę-c.

Aby debugować to, co próbujesz zrobić na ślepo, uruchom catlub cat > /dev/nullw swoim terminalu . Wpisz rzeczy, a następnie sprawdź, co działa, a co nie, aby je edytować.


readline(używane przez bash) odczytuje surowy znak i wykonuje edycję linii w przestrzeni użytkownika. Jego domyślne powiązania są jednak zgodne z domyślnymi znakami kontrolnymi TTY dla podzbioru funkcji edycyjnych, które oba zapewniają.

readline wykracza poza zwykłą edycję linii zwykłego TTY. (np TTY może jedynie usunąć znaki na końcu linii, więc nie ma ^ai deleteczy strzałka w lewo / w prawo)

Gdy bashuruchamia polecenie w planie, to stawia w trybie TTY kanonicznej pierwszy (ponieważ jest to ustawienie domyślne). Tak więc uruchomiona stty -a(bez przekierowania) zawsze zobaczy swój własny terminal w trybie kanonicznym. Ale jeśli przekierujesz dane wejściowe z innego bashdziałającego na nim TTY , możesz zobaczyć, jakie ustawienia terminalu zastosował bash + readline. np. stty -a < /dev/pts/12pokazuje -icanontryb surowy, ponieważ mam bashuruchomiony na tym terminalu. (Przełączyłem się na inną kartę i uruchomiłem tty, a następnie użyłem ścieżki pliku urządzenia z pierwszego terminala). Gdybym biegł catw tym drugim terminalu, sprawdziłbym icanontryb kanoniczny.

Powiązane: TTY odszyfrowany

https://www.gnu.org/software/libc/manual/html_node/Canonical-or-Not.html

https://en.wikipedia.org/wiki/POSIX_terminal_interface

Peter Cordes
źródło
Możesz po prostu wpisać „stty”, aby zobaczyć wszystkie bieżące ustawienia. Użycie „stty wierszy ##” lub „stty cols ##” pozwoli Ci w locie zmienić liczbę wierszy lub kolumn, które ma do dyspozycji okno terminala. Jest to szczególnie przydatne, gdy pracujesz w oknie w oknie przez coś takiego jak VNC, który niekoniecznie łapie, jak duże jest twoje okno zewnętrzne. Możesz w zasadzie Zdefiniować obszar aktywny, aby był mniejszy niż okno, w którym się znajduje, a następnie nie musiał się przewijać. Pozwolenie VI i innym rzeczom nadal działać poprawnie. Może także mapować backspace i usuwać w locie.
Rowan Hawkins
@RowanHawkins: mój ostatni akapit był źle edytowany. Naprawiono teraz. Próbowałem zwrócić uwagę, że przekierowując z innego tty, możesz zobaczyć ustawienia stty/ ioctl, które bash + readline zastosowało w trybie raw. (I fakt, że w ogóle jest w trybie surowym, gdzie większość znaków specjalnych nie ma zastosowania)
Peter Cordes