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

20

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

(Менять шрифт на черный на черном может быть сложно, просто скопировать и вставить - так что это не решение)

Гжегож Вежовецкий
источник
3
Для тех, кто читает это: НЕ читайте пароли с включенным эхом и черным по черному. Пароль все еще передается, и если терминал не знает директив терминала, которые вы использовали, символы будут отображаться эхом. Выключите эхо. Используйте termios, stty, read -s, все , что делает это.
Алексиос
Вот почему я написал, что это не решение;).
Гжегож Вежовецкий
В самом деле! Иногда люди снимают вопросы и приходят к ошибочным выводам. :)
Alexios

Ответы:

30

От help read:

-s        do not echo input coming from a terminal
Игнасио Васкес-Абрамс
источник
1
Отлично. Это не написано в моем man read, я не зарегистрировался help read. Хорошо знать.
Гжегож Вежовецкий
3
@GrzegorzWierzowiecki: Вы просматриваете неправильное руководство. Вы должны прочитать руководство по bash, то есть man bashтам вы можете найти опцию -sSilent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri
5

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

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

echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; stty -echo; read passwd; stty echo; echo
program $uname $passwd
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, поэтому я знаю это довольно хорошо с этой точки зрения. Это не очень сложно перевести на другие языки.

Dylan
источник
-1

Ваш вопрос звучит по-разному "как инструменты ???" поэтому я точно не знаю, будет ли это работать для вас:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
2bc
источник