У меня есть скрипт, который автоматизирует процесс, который требует доступа к системе, защищенной паролем. Доступ к системе осуществляется через программу командной строки, которая принимает пароль пользователя в качестве аргумента.
Я хотел бы предложить пользователю ввести свой пароль, назначить его переменной оболочки, а затем использовать эту переменную для создания командной строки обращающейся к нему программы (которая, конечно, будет выдавать потоковый вывод, который я буду обрабатывать).
Я достаточно компетентный программист оболочки в Bourne / Bash, но я не знаю, как принять пользовательский ввод, не передавая его эхо на терминал (или, возможно, не отображая его с помощью символов *).
Может кто-нибудь помочь с этим?
read
с-r
аргументом при чтении паролей. В противном случае обратная косая черта может быть потеряна. Ни один из ответов не упоминает об этом. Принятый ответ на дублирующий вопрос охватывает этот и еще несколько крайних случаев. Например, установкаIFS=
, чтобы не потерять концевые пробелы.Ответы:
Вот еще один способ сделать это:
read -s
Выключит эхо для вас. Просто замените вecho
последней строке команду, которую вы хотите запустить.источник
read
команды:read -s -p "Password:" password
read -s
это не в POSIX, ваш скрипт зависит от bash, если вы используете его. Если вы хотите быть POSIX-совместимым, вы должны вместо этого использоватьstty -echo
решение, предложенное ниже, потому чтоstty
и егоecho
параметр определены в POSIX.echo -n
не в POSIX тоже. Используйтеprintf
вместо этого./bin/bash
а не с/bin/sh
, только чтобы прояснить это.echo "$REPLY" | sed -r 's/./*/g'
(или даже произвольное количество звездочек) вместо пустого,echo
чтобы сообщить им, что их ввод пароля был увиден (если они набрали один. У меня есть пароль по умолчанию, если они решили пропустить подсказку в моем конкретном случае). сценарий)POSIX-совместимый ответ. Обратите внимание на использование
/bin/sh
вместо/bin/bash
. (Он работает с bash, но не требует bash.)источник
stty
если вы хотите быть POSIX совместимыми. Код в этом ответе отлично работает даже не на bash, а на всех оболочках, соответствующих POSIX.echo -n "Password: " && read -s password || { stty -echo; read password; stty echo; }
Один лайнер:
Под Linux (и cygwin) эта форма работает в bash и sh. Это может быть не стандартный Unix sh, хотя.
Для получения дополнительной информации и опций в bash введите «help read».
источник
-s
Вариантread
не определен в стандарте POSIX. См. Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Я хотел что-то, что будет работать для любой оболочки POSIX, поэтому я написал небольшую функцию, которая используетstty
для отключения эхо.Эта функция ведет себя очень похоже на
read
команду. Вот простое использование сread
последующим аналогичным использованиемread_secret
. Ввод дляread_secret
кажется пустым, потому что он не был отражен на терминале.Вот еще один, который использует
-r
опцию для сохранения обратной косой черты во входных данных. Это работает, потому чтоread_secret
определенная выше функция передает все полученные аргументыread
команде.Наконец, вот пример, который показывает, как использовать
read_secret
функцию для чтения пароля в соответствии с POSIX.источник
oldtty = stty -g
а затем в конце,stty $oldtty
чтобы восстановить предыдущие настройки. В противном случае это здорово.Я нашел эту
askpass
команду полезнойКаждый вводимый символ заменяется *. Смотрите: Дайте пароль ****
источник
/lib/cryptsetup/askpass
? Это, конечно, не стандартный * nix (или GNU / Linux) инструмент.sudo apt-get install cryptsetup
,Ctrl+C
он портит терминал/lib/cryptsetup/askpass "Give a password" > pass.txt
Очень полезно, спасибо!Выключите
echo
с помощьюstty
, затем снова включите после.источник
Вы также можете запросить пароль, не устанавливая переменную в текущей оболочке, выполнив что-то вроде этого:
Например:
Вы можете добавить несколько из этих запрашиваемых значений с разрывом строки, выполнив это:
источник
Для тех, кто хочет запросить пароль, вы можете быть заинтересованы в использовании encpass.sh . Это сценарий, который я написал для аналогичных целей: захват секрета во время выполнения и последующее шифрование. Последующие запуски не запрашивают пароль, поскольку он просто использует зашифрованное значение с диска.
Он хранит зашифрованные пароли в скрытой папке в домашнем каталоге пользователя или в пользовательской папке, которую можно определить с помощью переменной среды ENCPASS_HOME_DIR. Он разработан для совместимости с POSIX и имеет лицензию MIT, поэтому его можно использовать даже в корпоративных корпоративных средах. Моя компания, ООО «Плинт» , поддерживает сценарий и периодически выпускает обновления. Запросы на извлечение также приветствуются, если вы обнаружили проблему. :)
Чтобы использовать его в своих сценариях, просто введите в свой сценарий encpass.sh и вызовите функцию get_secret. Я включил копию сценария ниже для удобства просмотра.
источник
Эта ссылка помогает определить, * Как прочитать пароль из использования, не возвращая его обратно в терминал * Как заменить каждый символ с * -символом.
https://www.tutorialkart.com/bash-shell-scripting/bash-read-username-and-password/
источник
Прежде всего, если кто-то собирается сохранить какой-либо пароль в файле, я бы позаботился о том, чтобы он хэшировался. Это не лучшая защита, но, по крайней мере, она не будет в текстовом формате.
Сначала создайте пароль и хэшируйте его:
Теперь создайте свою программу для использования хэша. В этом случае эта маленькая программа получает вводимые пользователем данные для ввода пароля без повторения, а затем преобразует их в хеш-код для сравнения с сохраненным хеш-кодом. Если он соответствует сохраненному хешу, доступ предоставляется:
источник
\n
полученный в результате выполненияecho
команды,echo -n
вместо хэширования , поскольку вместо этого\n
он не является частью предоставленного пароля - конечно, как для создания, так/tmp/secret
и для сравнения, которое следует в вашем примере.