Как получить пароль от сценария оболочки без эха


У меня есть скрипт, который автоматизирует процесс, который требует доступ к защищенной паролем системы. Системой осуществляется через программу командной строки, которая принимает пароль пользователя в качестве аргумента.

Я хотел бы предложить пользователю ввести свой пароль, назначить его переменной оболочки, а затем использовать эту переменную для построения командной строки программы доступа (которая, конечно же, будет производить вывод потока, который я буду обрабатывать).

Я достаточно компетентный программист оболочки в Bourne / Bash, но я не знаю, как принять пользовательский ввод, не имея его эхо на терминал (или, возможно, с помощью символов'*').

может кто-нибудь помочь с этим?

7 284

7 ответов:

вот еще один способ сделать это:

#!/bin/bash
# Read Password
echo -n Password: 
read -s password
echo
# Run Command
echo $password

The 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

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, затем снова после этого.

прежде всего, если кто-то собирается хранить любой пароль в файле. Я бы убедился, что это хэш. Это не лучшая защита, но по крайней мере она не будет в открытом виде.

  1. сначала создайте пароль и хэш:

    echo "password123" | md5sum | cut-d '-' -f 1 > /tmp/secret

  2. Теперь создайте свою программу для использования хэша, в этом случае эта небольшая программа получает пользовательский ввод пароля без эха, а затем преобразует его в хэш для сравнения с сохраненным хэшем. Если он соответствует сохраненному хэшу, то доступ предоставляется:

    #!/ 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