it-swarm.com.ru

Как получить пароль из сценария Shell, не повторяя

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

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

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

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

328
BD at Rivenhill

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

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

read -s отключит эхо для вас. Просто замените echo в последней строке командой, которую вы хотите запустить.

494
wsware
#!/bin/bash
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
162
thecloud

Один лайнер: 

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
70
smendola

Параметр -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 ...
44
Susam Pal

Я нашел полезной команду askpass

password=$(/lib/cryptsetup/askpass "Give a password")

Каждый вводимый символ заменяется *. Смотрите: Дайте пароль ****

9
Manuel

Выключите echo с помощью stty , затем снова включите после.

3
Ignacio Vazquez-Abrams

Вы также можете запросить пароль, не устанавливая переменную в текущей оболочке, выполнив что-то вроде этого:

$(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)
0
Pascal Chardon

Эта ссылка помогает определить, * Как прочитать пароль из использования, не возвращая его обратно в терминал * Как заменить каждый символ с * -символом.

https://www.tutorialkart.com/bash-Shell-scripting/bash-read-username-and-password/

0
Hassan Farid