105

Есть ли способ удалить все символы, которые я ввел в скрытой подсказке пароля в Linux? Например, когда я SSH к серверу, он запрашивает мой пароль, где введенные ключи не отображаются:

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

Есть ли способ удалить весь мой введенный текст, не нажимая клавишу Backspace в течение неизвестного периода времени? Когда я думаю, что ввел что-то неправильно, я хочу начать все сначала, и нажатие клавиши backspace на несколько секунд раздражает. Я попробовал Esc, Ctrl A, чтобы выделить весь текст и Home. Ctrl C отменяет всю команду, и я должен отправить команду снова, чтобы повторить попытку. Это почти лучшее и быстрое решение, но все же не удовлетворяет. Вставка не работает в моей оболочке тоже.

2 ответа2

163

Вы можете удалить весь введенный пароль с помощью Ctrl+U.

14

В отличие от bash , в командной строке ssh не используется какая-либо специальная библиотека ввода терминала, например readline . Функции редактирования строк - это только базовые функции редактирования строк POSIX TTY.

Итак, у вас есть POSIX TTY в "приготовленном" режиме (не в необработанном виде), он же канонический режим, и единственное доступное редактирование строк - это то, что обеспечивает ядро. Смотрите stty(1) и обратите внимание, что
kill = ^U Здесь также определяется символ возврата (erase = ^?). Стирание слов (^W) удобно, когда вы не печатаете вслепую.

lnext = ^V означает, что вы можете набрать control-v, затем что угодно (включая control-c), чтобы получить буквальный control-c.

Чтобы отладить то, что вы пытались делать вслепую, запустите cat или cat > /dev/null в своем терминале. Напечатайте вещи, затем посмотрите, что работает, а что нет, чтобы редактировать.


readline (используется bash) читает необработанные символы и выполняет редактирование строки в пространстве пользователя. Однако его привязки по умолчанию совместимы с управляющими символами TTY по умолчанию для подмножества функций редактирования, которые они оба предоставляют.

readline выходит далеко за рамки простого редактирования строки простого TTY. (например, TTY может удалять только символы в конце строки, так что нет ^a и delete или стрелка влево / вправо)

Когда bash запускает команду на переднем плане, она сначала переводит TTY в канонический режим (потому что это по умолчанию). Таким образом, при запуске stty -a (без перенаправления) всегда будет отображаться собственный терминал в каноническом режиме. Но если вы перенаправите ввод с другого TTY, на котором запущен bash , вы увидите, какие настройки терминала применены bash + readline. например, stty -a < /dev/pts/12 показывает -icanon для режима raw, потому что на этом терминале работает bash . (Я переключился на другую вкладку и запустил tty , затем использовал этот путь к файлу устройства с первого терминала). Если бы я запускал cat в этом другом терминале, я бы увидел icanon для канонического режима.

Связанный: TTY демистифицирован

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .