У меня есть сценарий bash, подобный следующему:
#!/bin/bash
echo "Please enter your username";
read username;
echo "Please enter your password";
read password;
Я хочу, чтобы когда пользователь вводил пароль на терминале, он не отображался (или отображалось что-то вроде *******). Как мне этого добиться?
*
read
? и другие.Ответы:
Просто поставьте -s для вашего вызова чтения вот так:
источник
-s
отображает, пока введены данные. (не является расширением POSIX, поэтому не все оболочки поддерживают его, например оболочка, которая поставляется с BusyBox; используйте подход в таких оболочках)-s
ash
ssty -echo
man
странице фактически не предполагает, что-s
цвет текста устанавливается таким же, как цвет фона. Он просто "беззвучно перекликается". ss64.com/bash/read.htmlSilent mode. If input is coming from a terminal, characters are not echoed.
Обновить
Если вы хотите пофантазировать, выводя
*
для каждого набранного символа, вы можете сделать что-то вроде этого (используяread -s
решение Андреаса ):Без фантазии
источник
IFS=$'\n'
так, чтобы вы действительно могли закончить ввод пароля. В остальном приятно; очень умный.IFS=$'\n'
потому что разделитель чтения по умолчанию-d $'\n'
. Оператор if для разрыва нулевой строки, который происходит с новой строки, позволяет им завершить ввод пароля.read
-d ''
-d ''
для решения, которое работает без bash или определенных функций, которые
read
вы можете использоватьstty
для отключения эхаисточник
Вот вариант отличного
*
решения для печати @ SiegeXbash
с добавленной поддержкой backspace ; это позволяет пользователю исправить свой ввод с помощьюbackspace
ключа (delete
ключа на Mac) , что обычно поддерживается запросами пароля:Примечание:
0x7f
: «В современных системах клавиша Backspace часто сопоставляется с символом удаления (0x7f в ASCII или Unicode)» https://en.wikipedia.org/wiki/Backspace\b \b
необходим, чтобы создать видимость удаления символа слева; просто использование\b
перемещает курсор влево, но оставляет символ без изменений ( неразрушающий возврат). При печати пробела и повторном перемещении назад символ кажется удаленным (спасибо, escape-символ «backspace» '\ b' в C, неожиданное поведение? ).В оболочке, предназначенной только для POSIX (например,
sh
в Debian и Ubuntu, гдеsh
естьdash
), используйте этотstty -echo
подход (который неоптимален, потому что ничего не печатает ), потому чтоread
встроенная функция не поддерживает параметры-s
и-n
.источник
Немного отличается от (но в основном похож) на ответ @ lesmana
просто: скрыть эхо, показать эхо
источник
stty
вызова и на одну переменную в стеке меньше - только убирая эхо и только восстанавливая эхо. Есть ли способ, которым это могло нарушить другиеstty
настройки? Lesmana's сохраняет все настройки.Вот вариант ответа @ SiegeX, который работает с традиционной оболочкой Борна (которая не поддерживает
+=
назначения).источник
[[ ... ]]
, и ееread
встроенная оболочка не имеет параметров-s
и-n
. Поэтому ваш код, например, не будет работатьdash
. (Он будет работать на тех платформах, где онsh
есть на самом делеbash
, например, на OSX, гдеbash
при вызове assh
просто изменяет несколько параметров по умолчанию, все еще поддерживая большинство башизмов.)[
но, очевидно, я мало что могу сделать, если у васread
нет этих вариантов.Я всегда люблю использовать escape-символы Ansi:
8m
делает текст невидимым и0m
сбрасывает текст на «нормальный». -E делает возможным побег Анси.Единственное предостережение: вы все еще можете копировать и вставлять текст, который там есть, поэтому вам, вероятно, не стоит использовать это, если вам действительно нужна безопасность.
Это просто позволяет людям не смотреть на ваши пароли, когда вы их вводите. Просто не оставляйте компьютер включенным после этого. :)
НОТА:
Вышеупомянутое не зависит от платформы, если оно поддерживает escape-последовательности Ansi.
Однако для другого решения Unix вы можете просто сказать,
read
чтобы символы не отображались ...источник
источник