Чтение паролей без отображения на экране в скриптах Bash

Чтение паролей без отображения на экране в скриптах Bash

Как можно считать пароли в скриптах bash таким образом, чтобы инструменты не отображали их на терминале?

(Изменение шрифта на черный на черном легко обойти с помощью копирования и вставки, так что это не решение.)

решение1

От help read:

-s        do not echo input coming from a terminal

Например, чтобы запросить у пользователя и считать произвольный пароль в переменную passwd,

IFS= read -s -p 'Password please: ' passwd

решение2

Я всегда stty -echoотключал эхо, затем читал и потом делал stty echo(подробнее см. man of stty- ie man stty). Это более полезно с точки зрения программиста, так как вы можете отключить эхо, а затем прочитать пароль из языка программирования, например Java, C(++), Python и т. д. с их стандартными stdin "читателями".

В bash использование может выглядеть так:

echo -n "USERNAME: "; IFS= read -r uname
echo -n "PASSWORD: "; stty -echo; IFS= read -r passwd; stty echo; echo
program "$uname" "$passwd"
unset -v passwd    # get rid of passwd

Например, Python будет выглядеть так:

from sys import stdout
from os import system as term

uname = raw_input("USERNAME: ") # read input from stdin until [Enter] in 2
stdout.write("PASSWORD: ")
term("stty -echo") # turn echo off
try:
    passwd = raw_input()
except KeyboardInterrupt: # ctrl+c pressed
    raise SystemExit("Password attempt interrupted")
except EOFError: # ctrl+d pressed
    raise SystemExit("Password attempt interrupted")
finally:
    term("stty echo") # turn echo on again

print "username:", uname
print "password:", "*" * len(passwd)

Мне приходилось делать это много раз в Python, так что я знаю это довольно хорошо с этой точки зрения. Хотя это не так уж и сложно перевести на другие языки.

решение3

Если вас устраивает добавление внешней зависимости, вы можете использовать поле ввода пароля, предоставляемое такими инструментами, как dialog или whiptail.

Хлыстохвост

решение4

Ваш вопрос звучит немного по-другому: «в каком-то смысле как инструменты???», поэтому я не знаю, подойдет ли вам это:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******

Связанный контент