Читання паролів без показу на екрані в Bash Scripts


20

Як читати паролі в bash-скриптах таким чином, як інструменти, які не показують його на терміналі?

(Зміна шрифту на чорний на чорний може бути складним шляхом простого копіювання та вставки - тому це не рішення)


3
Для тих, хто читає це: НЕ читайте паролі з відлунням і чорно-на-чорному. Пароль все одно передається, і якщо термінал не знає використовуваних вами директив терміналів, символи будуть помітно лунати. Вимкніть відлуння. Використовуйте termios, stty, read -s, все , що робить це.
Алексіос

Тому я написав, що це не рішення;).
Grzegorz Wierzowiecki

Справді! Іноді люди скидають питання і приходять до помилкових висновків. :)
Олексій

Відповіді:


30

Від help read:

-s        do not echo input coming from a terminal

1
Чудово. Це не написано в моєму man read, я не зареєструвався help read. Добре знати.
Grzegorz Wierzowiecki

3
@GrzegorzWierzowiecki: Ви переглядаєте неправильну інструкцію. ви повинні прочитати посібник з bash, тобто man bashтам ви можете знайти -s варіантSilent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri

5

Я завжди stty -echoвимикав відлуння, потім читав, а потім робив stty echo(читати більше, переглядаючи людину stty- тобто man stty). Це корисніше з точки зору програмістів, оскільки ви можете вимкнути відлуння, а потім прочитати пароль з такої мови програмування, як Java, C (++), Python тощо, зі своїми стандартними "читачами".

У 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, тому я знаю це досить добре з тієї точки зору. Але це не дуже важко перекласти на інші мови.


-1

Ваше запитання читає щось на зразок "таким чином, як інструменти ???" тож я точно не знаю, чи це спрацює для вас:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.