Как получить пароль из сценария оболочки без эха
У меня есть сценарий, который автоматизирует процесс, который нуждается в доступе к защищенной паролем системе. Доступ к системе осуществляется с помощью командной строки, которая принимает пароль пользователя в качестве аргумента.
Я хотел бы предложить пользователю ввести пароль, назначить его переменной оболочки, а затем использовать эту переменную для построения командной строки программы доступа (которая, конечно же, будет генерировать stream, который я буду обрабатывать).
Я достаточно компетентный программист оболочки в Bourne / Bash, но я не знаю, как принять ввод пользователя без его эхо-сигнала на терминал (или, возможно, его эхо-сигнал с использованием символов «*»).
- Получить только имя файла из пути в сценарии Bash
- Почему равный оператор не работает, если он не окружен пространством?
- Как установить текущий рабочий каталог в каталог скрипта?
- Как объявить и использовать логические переменные в сценарии оболочки?
- Как выполнить произвольную командную строку из строки?
Может кто-нибудь помочь с этим?
Вот еще один способ сделать это:
#!/bin/bash # Read Password echo -n Password: read -s password echo # Run Command echo $password
read -s
отключит эхо для вас. Просто замените echo
на последней строке командой, которую вы хотите запустить.
#!/bin/bash stty -echo printf "Password: " read PASSWORD stty echo printf "\n"
Один лайнер:
read -s -p "Password: " password
В Linux (и cygwin) эта форма работает в bash и sh. Однако это может быть не стандартная Unix sh.
Для получения дополнительной информации и параметров в bash введите «help read».
$ help read read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] Read a line from the standard input and split it into fields. ... -p prompt output the string PROMPT without a trailing newline before attempting to read ... -s do not echo input coming from a terminal
Опция -s
read
не определена в стандарте POSIX. См. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Я хотел что-то, что будет работать для любой оболочки POSIX, поэтому я написал небольшую функцию, которая использует stty
для отключения эха.
#!/bin/sh # Read secret string read_secret() { # Disable echo. stty -echo # Set up trap to ensure echo is enabled before exiting if the script # is terminated while echo is disabled. trap 'stty echo' EXIT # Read secret. read "[email protected]" # Enable echo. stty echo trap - EXIT # Print a newline because the newline entered by the user after # entering the passcode is not echoed. This ensures that the # next line of output begins at a new line. echo }
Эта функция ведет себя очень похоже на команду read
. Вот простое использование read
за которым следует аналогичное использование read_secret
. Вход в read_secret
выглядит пустым, потому что он не отражается на терминале.
[[email protected] ~]$ read abc foo \bar baz \qux [[email protected] ~]$ echo a=$ab=$bc=$c a=foo b=bar c=baz qux [[email protected] ~]$ unset abc [[email protected] ~]$ read_secret abc [[email protected] ~]$ echo a=$ab=$bc=$c a=foo b=bar c=baz qux [[email protected] ~]$ unset abc
Вот еще один, который использует параметр -r
для сохранения обратных косых черт во входе. Это работает, потому что read_secret
выше функция read_secret
передает все аргументы, которые она получает команде read
.
[[email protected] ~]$ read -rabc foo \bar baz \qux [[email protected] ~]$ echo a=$ab=$bc=$c a=foo b=\bar c=baz \qux [[email protected] ~]$ unset abc [[email protected] ~]$ read_secret -rabc [[email protected] ~]$ echo a=$ab=$bc=$c a=foo b=\bar c=baz \qux [[email protected] ~]$ unset abc
Наконец, вот пример, который показывает, как использовать функцию read_secret
для чтения пароля в соответствии с POSIX.
printf "Password: " read_secret password # Do something with $password here ...
Я нашел, что команда askpass
полезна
password=$(/lib/cryptsetup/askpass "Give a password")
Каждый входной символ заменяется на *. См.: Введите пароль ****
Выключите echo
используя stty
, затем снова включите его.
Прежде всего, если кто-то собирается хранить любой пароль в файле. Я бы удостоверился, что это хешировано. Это не лучшая безопасность, но, по крайней мере, она не будет в открытом виде.
-
Сначала создайте пароль и хеш его:
echo “password123” | md5sum | cut -d ‘-‘ -f 1> / tmp / secret
-
Теперь создайте свою программу для использования hashа, в этом случае эта небольшая программа получает пользовательский ввод для пароля без эха, а затем преобразует его в хеш для сравнения с сохраненным hashем. Если он совпадает с сохраненным хешем, то предоставляется доступ:
#! / Bin / Баш
PASSWORD_FILE="/tmp/secret" MD5_HASH=$(cat /tmp/secret) PASSWORD_WRONG=1 while [ $PASSWORD_WRONG -eq 1 ] do echo "Enter your password:" read -s ENTERED_PASSWORD if [ "$MD5_HASH" != "$(echo $ENTERED_PASSWORD | md5sum | cut -d '-' -f 1)" ]; then echo "Access Deniend: Incorrenct password!. Try again" else echo "Access Granted" PASSWORD_WRONG=0 fi done