Как получить пароль от сценария оболочки без эха
У меня есть скрипт, который автоматизирует процесс, который требует доступ к защищенной паролем системы. Системой осуществляется через программу командной строки, которая принимает пароль пользователя в качестве аргумента.
Я хотел бы предложить пользователю ввести свой пароль, назначить его переменной оболочки, а затем использовать эту переменную для построения командной строки программы доступа (которая, конечно же, будет производить вывод потока, который я буду обрабатывать).
Я достаточно компетентный программист оболочки в Bourne / Bash, но я не знаю, как принять пользовательский ввод, не имея его эхо на терминал (или, возможно, с помощью символов'*').
может кто-нибудь помочь с этим?
7 ответов:
вот еще один способ сделать это:
#!/bin/bash # Read Password echo -n Password: read -s password echo # Run Command echo $password
The
read -s
отключит Эхо для вас. Просто заменитеecho
в последней строке с командой, которую вы хотите запустить.
один лайнер:
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
The на
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 "$@" # 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 }
эта функция ведет себя очень похоже на
Я нашел, чтобы быть
askpass
команды полезнымpassword=$(/lib/cryptsetup/askpass "Give a password")
каждый входной символ заменяется на *. Видеть: Дайте пароль****
поворот
echo
с помощьюstty
, затем снова после этого.
прежде всего, если кто-то собирается хранить любой пароль в файле. Я бы убедился, что это хэш. Это не лучшая защита, но по крайней мере она не будет в открытом виде.
сначала создайте пароль и хэш:
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