Как получить пароль из оболочки script без эха
У меня есть script, который автоматизирует процесс, который нуждается в доступе к защищенной паролем системе. Доступ к системе осуществляется с помощью командной строки, которая принимает пароль пользователя в качестве аргумента.
Я хотел бы предложить пользователю ввести свой пароль, назначить его переменной оболочки, а затем использовать эту переменную для построения командной строки программы доступа (которая, конечно же, будет производить поток, который я буду обрабатывать),
Я достаточно компетентный программист оболочки в Bourne/ Bash, но я не знаю, как принять ввод пользователя без его эхо-вывода на терминал (или, возможно, его эхо-сигнал с использованием символов "*" ).
Может ли кто-нибудь помочь с этим?
Ответы
Ответ 1
Вот еще один способ сделать это:
#!/bin/bash
# Read Password
echo -n Password:
read -s password
echo
# Run Command
echo $password
read -s
отключит эхо для вас. Просто замените echo
на последней строке командой, которую вы хотите запустить.
Ответ 2
POSIX-совместимый ответ. Обратите внимание на использование /bin/sh
вместо /bin/bash
. (Он работает с bash, но не требует bash.)
#!/bin/sh
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
Ответ 3
Один вкладыш:
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
Ответ 4
Опция -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 a b c
foo \bar baz \qux
[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[[email protected] ~]$ unset a b c
[[email protected] ~]$ read_secret a b c
[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[[email protected] ~]$ unset a b c
Вот еще один, который использует параметр -r
для сохранения обратных косых черт во входе. Это работает, потому что функция read_secret
, определенная выше, передает все аргументы, которые она получает команде read
.
[[email protected] ~]$ read -r a b c
foo \bar baz \qux
[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[[email protected] ~]$ unset a b c
[[email protected] ~]$ read_secret -r a b c
[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[[email protected] ~]$ unset a b c
Наконец, вот пример, который показывает, как использовать функцию read_secret
для чтения пароля в соответствии с POSIX.
printf "Password: "
read_secret password
# Do something with $password here ...
Ответ 5
Я нашел команду askpass
полезной
password=$(/lib/cryptsetup/askpass "Give a password")
Каждый входной символ заменяется на *. Видеть:
Введите пароль ****
Ответ 6
Отключите echo
, используя stty
, затем снова включитесь после.
Ответ 7
Вы также можете запросить пароль, не устанавливая переменную в текущей оболочке, выполнив что-то вроде этого:
$(read -s;echo $REPLY)
Например:
my-command --set password=$(read -sp "Password: ";echo $REPLY)
Вы можете добавить несколько из этих запрашиваемых значений с разрывом строки, выполнив это:
my-command --set user=$(read -sp "'echo $'\n ''User: ";echo $REPLY) --set password=$(read -sp "'echo $'\n ''Password: ";echo $REPLY)
Ответ 8
Эта ссылка помогает определить *, как читать пароль из использования, не возвращая его обратно в терминал *, как заменить каждый символ на * -character.
https://www.tutorialkart.com/bash-shell-scripting/bash-read-username-and-password/
Ответ 9
Прежде всего, если кто-то собирается сохранить какой-либо пароль в файле, я бы позаботился о том, чтобы он хэшировался. Это не лучшая безопасность, но, по крайней мере, она не будет в текстовом виде.
-
Сначала создайте пароль и хэшируйте его:
echo "password123" | md5sum | cut -d '-' -f 1 > /tmp/secret
-
Теперь создайте свою программу для использования хэша. В этом случае эта небольшая программа получает вводимые пользователем данные для ввода пароля без повторения, а затем преобразует их в хеш-код для сравнения с сохраненным хеш-кодом. Если он соответствует сохраненному хешу, доступ предоставляется:
#!/bin/bash
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
Ответ 10
echo yourpassword | passwd --stdin youruser