How to read passwords in bash scripts in a way like tools which are not showing it on terminal ?

(Changing font to black on black might be tricky by easy to copy&paste - so it's not solution)

  • 3
    For anyone reading this: do NOT read in passwords with echo on and black-on-black. The password is still transmitted, and if the terminal doesn't know the terminal directives you've used, characters will echo visibly. Turn echo off. Use termios, stty, read -s, anything that does it. – Alexios Mar 26 '12 at 22:14
  • That's why I've wrote, that it is not a solution ;). – Grzegorz Wierzowiecki Mar 26 '12 at 22:18
  • Indeed! Sometimes people skim questions and come to misguided conclusions. :) – Alexios Mar 26 '12 at 22:25

From help read:

-s        do not echo input coming from a terminal
|improve this answer|||||
  • 1
    Great. It's not written in my man read, I haven't check in help read. Good to know. – Grzegorz Wierzowiecki Mar 26 '12 at 21:19
  • 3
    @GrzegorzWierzowiecki: You are viewing the wrong manual. you have to read the manual of bash i.e man bash and there you can find -s option Silent mode. If input is coming from a terminal, characters are not echoed. – pradeepchhetri Mar 27 '12 at 6:34

I always used stty -echo to turn echoing off, then read and afterwards do stty echo (read more by viewing man of stty - i.e. man stty). This is more useful from a programmers perspective as you can turn echoing off and then read a password from a programming language such as Java, C(++), Python, etc. with their standard stdin "readers."

In bash, the usage could look like this:

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

Python, for example, would look like:

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
    passwd = raw_input()
except KeyboardInterrupt: # ctrl+c pressed
    raise SystemExit("Password attempt interrupted")
except EOFError: # ctrl+d pressed
    raise SystemExit("Password attempt interrupted")
    term("stty echo") # turn echo on again

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

I had to do this a lot of times in Python, so I know it pretty well from that perspective. This isn't very hard to translate to other languages, though.

|improve this answer|||||

Your question reads kind of different "in a way like tools???" so I don't exactly know if this will work for you:

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.